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.
Files changed (2) hide show
  1. data/lib/fasterer_csv.rb +38 -22
  2. metadata +2 -2
@@ -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
- row << (column.empty? ? nil : column.join)
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
- row << (column.empty? ? nil : column.join)
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 << row
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
metadata CHANGED
@@ -5,8 +5,8 @@ version: !ruby/object:Gem::Version
5
5
  segments:
6
6
  - 0
7
7
  - 0
8
- - 2
9
- version: 0.0.2
8
+ - 3
9
+ version: 0.0.3
10
10
  platform: ruby
11
11
  authors:
12
12
  - Mason