fasterer-csv 0.0.2 → 0.0.3
Sign up to get free protection for your applications and to get access to all the features.
- 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
|