fasterer-csv 0.0.2 → 0.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/lib/fasterer_csv.rb +38 -22
- metadata +2 -2
data/lib/fasterer_csv.rb
CHANGED
|
@@ -119,7 +119,7 @@ module FastererCSV
|
|
|
119
119
|
end
|
|
120
120
|
|
|
121
121
|
def parse(data, quot = '~', sep = ',')
|
|
122
|
-
q, s, row, column, inquot, clean, maybe, table, field = quot[0], sep[0], [], [], false, true, false, nil, true
|
|
122
|
+
q, s, row, column, inquot, clean, maybe, table, field, endline = quot[0], sep[0], [], [], false, true, false, nil, true, false
|
|
123
123
|
|
|
124
124
|
data.each_byte do |c|
|
|
125
125
|
next if c == ?\r
|
|
@@ -127,44 +127,56 @@ module FastererCSV
|
|
|
127
127
|
if maybe && c == s
|
|
128
128
|
row << column.join
|
|
129
129
|
column.clear
|
|
130
|
-
clean, inquot, maybe, field = true, false, false, true
|
|
130
|
+
clean, inquot, maybe, field, endline = true, false, false, true, false
|
|
131
131
|
elsif maybe && c == ?\n && table.nil?
|
|
132
|
-
row << column.join
|
|
132
|
+
row << column.join unless (column.empty? && endline)
|
|
133
133
|
column.clear
|
|
134
|
-
table = Table.new(row)
|
|
135
|
-
row, clean, inquot, maybe, field = [], true, false, false, false
|
|
134
|
+
table = Table.new(row) unless row.empty?
|
|
135
|
+
row, clean, inquot, maybe, field, endline = [], true, false, false, false, true
|
|
136
136
|
elsif maybe && c == ?\n
|
|
137
|
-
row << column.join
|
|
137
|
+
row << column.join unless (column.empty? && endline)
|
|
138
138
|
column.clear
|
|
139
|
-
table << row
|
|
140
|
-
row, clean, inquot, maybe, field = [], true, false, false, false
|
|
139
|
+
table << row unless row.empty?
|
|
140
|
+
row, clean, inquot, maybe, field, endline = [], true, false, false, false, true
|
|
141
141
|
elsif clean && c == q
|
|
142
|
-
inquot, clean = true, false
|
|
142
|
+
inquot, clean, endline = true, false, false
|
|
143
143
|
elsif maybe && c == q
|
|
144
144
|
column << c.chr
|
|
145
|
-
clean, maybe = false, false
|
|
145
|
+
clean, maybe, endline = false, false, false
|
|
146
146
|
elsif c == q
|
|
147
|
-
maybe = true
|
|
147
|
+
maybe, endline = true, false
|
|
148
148
|
elsif inquot
|
|
149
149
|
column << c.chr
|
|
150
|
-
clean = false
|
|
150
|
+
clean, endline = false, false
|
|
151
151
|
elsif c == s
|
|
152
152
|
row << (column.empty? ? nil : column.join)
|
|
153
153
|
column.clear
|
|
154
|
-
clean, field = true, true
|
|
154
|
+
clean, field, endline = true, true, false
|
|
155
155
|
elsif c == ?\n && table.nil?
|
|
156
|
-
|
|
156
|
+
|
|
157
|
+
if column.empty? && !endline
|
|
158
|
+
row << nil
|
|
159
|
+
elsif !column.empty?
|
|
160
|
+
row << column.join
|
|
161
|
+
end
|
|
162
|
+
|
|
157
163
|
column.clear
|
|
158
|
-
table = Table.new(row)
|
|
159
|
-
row, clean, inquot, field = [], true, false, false
|
|
164
|
+
table = Table.new(row) unless row.empty?
|
|
165
|
+
row, clean, inquot, field, endline = [], true, false, false, true
|
|
160
166
|
elsif c == ?\n
|
|
161
|
-
|
|
167
|
+
|
|
168
|
+
if column.empty? && !endline
|
|
169
|
+
row << nil
|
|
170
|
+
elsif !column.empty?
|
|
171
|
+
row << column.join
|
|
172
|
+
end
|
|
173
|
+
|
|
162
174
|
column.clear
|
|
163
|
-
table << row
|
|
164
|
-
row, clean, inquot, field = [], true, false, false
|
|
175
|
+
table << row unless row.empty?
|
|
176
|
+
row, clean, inquot, field, endline = [], true, false, false, true
|
|
165
177
|
else
|
|
166
178
|
column << c.chr
|
|
167
|
-
clean = false
|
|
179
|
+
clean, endline = false, false
|
|
168
180
|
end
|
|
169
181
|
end
|
|
170
182
|
|
|
@@ -174,14 +186,18 @@ module FastererCSV
|
|
|
174
186
|
else
|
|
175
187
|
row << (column.empty? ? nil :column.join)
|
|
176
188
|
end
|
|
177
|
-
table
|
|
189
|
+
if table
|
|
190
|
+
table << row unless row.empty?
|
|
191
|
+
else
|
|
192
|
+
table = Table.new(row) unless row.empty?
|
|
193
|
+
end
|
|
178
194
|
elsif field
|
|
179
195
|
row << (column.empty? ? nil : column.join)
|
|
180
196
|
end
|
|
181
197
|
|
|
182
198
|
table.each do |line|
|
|
183
199
|
yield(line)
|
|
184
|
-
end if block_given?
|
|
200
|
+
end if table && block_given?
|
|
185
201
|
|
|
186
202
|
table
|
|
187
203
|
end
|