fasterer-csv 0.0.10 → 0.0.11

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 +44 -26
  2. metadata +3 -3
@@ -210,13 +210,17 @@ module FastererCSV
210
210
  super(ch.chr)
211
211
  end
212
212
 
213
- def join
214
- if @int
215
- super.to_i
213
+ def convert(as_string = false)
214
+ if as_string
215
+ join
216
+ elsif empty?
217
+ nil
218
+ elsif @int
219
+ join.to_i
216
220
  elsif @float
217
- super.to_f
221
+ join.to_f
218
222
  else
219
- super
223
+ join
220
224
  end
221
225
  end
222
226
 
@@ -228,6 +232,16 @@ module FastererCSV
228
232
  super(ch.chr)
229
233
  end
230
234
 
235
+ def convert(as_string = false)
236
+ if as_string
237
+ join
238
+ elsif empty?
239
+ nil
240
+ else
241
+ join
242
+ end
243
+ end
244
+
231
245
  end
232
246
 
233
247
  class << self
@@ -255,16 +269,16 @@ module FastererCSV
255
269
  next if c == ?\r
256
270
 
257
271
  if maybe && c == s
258
- row << column.join
272
+ row << column.convert(true)
259
273
  column.clear
260
274
  clean, inquot, maybe, field, endline = true, false, false, true, false
261
275
  elsif maybe && c == ?\n && table.nil?
262
- row << column.join unless (column.empty? && endline)
276
+ row << column.convert(true) unless (column.empty? && endline)
263
277
  column.clear
264
278
  table = Table.new(row, fail_on_malformed) unless row.empty?
265
279
  row, clean, inquot, maybe, field, endline = [], true, false, false, false, true
266
280
  elsif maybe && c == ?\n
267
- row << column.join unless (column.empty? && endline)
281
+ row << column.convert(true) unless (column.empty? && endline)
268
282
  column.clear
269
283
  table << row unless row.empty?
270
284
  row, clean, inquot, maybe, field, endline = [], true, false, false, false, true
@@ -279,27 +293,19 @@ module FastererCSV
279
293
  column << c
280
294
  clean, endline = false, false
281
295
  elsif c == s
282
- row << (column.empty? ? nil : column.join)
296
+ row << column.convert(false)
283
297
  column.clear
284
298
  clean, field, endline = true, true, false
285
299
  elsif c == ?\n && table.nil?
286
300
 
287
- if column.empty? && !endline
288
- row << nil
289
- elsif !column.empty?
290
- row << column.join
291
- end
301
+ row << column.convert(false) unless column.empty? && endline
292
302
 
293
303
  column.clear
294
304
  table = Table.new(row, fail_on_malformed) unless row.empty?
295
305
  row, clean, inquot, field, endline = [], true, false, false, true
296
306
  elsif c == ?\n
297
307
 
298
- if column.empty? && !endline
299
- row << nil
300
- elsif !column.empty?
301
- row << column.join
302
- end
308
+ row << column.convert(false) unless column.empty? && endline
303
309
 
304
310
  column.clear
305
311
  table << row unless row.empty?
@@ -311,18 +317,14 @@ module FastererCSV
311
317
  end
312
318
 
313
319
  if !clean
314
- if maybe
315
- row << column.join
316
- else
317
- row << (column.empty? ? nil :column.join)
318
- end
320
+ row << column.convert(maybe)
319
321
  if table
320
322
  table << row unless row.empty?
321
323
  else
322
324
  table = Table.new(row, fail_on_malformed) unless row.empty?
323
325
  end
324
326
  elsif field
325
- row << (column.empty? ? nil : column.join)
327
+ row << column.convert(maybe)
326
328
  end
327
329
 
328
330
  table.each do |line|
@@ -333,15 +335,18 @@ module FastererCSV
333
335
  end
334
336
 
335
337
  def quot_row(row, q = '~', s = ',')
338
+ needs_quot = /(?:[#{q}#{s}\n]|^\d+$)/
336
339
  row.map do |val|
337
340
  if val.nil?
338
341
  ""
342
+ elsif val.class == Numeric
343
+ val.to_s
339
344
  else
340
345
  val = String(val)
341
346
  if val.length == 0
342
347
  q * 2
343
348
  else
344
- val[/[#{q}#{s}\n]/] ? q + val.gsub(q, q * 2) + q : val
349
+ val[needs_quot] ? q + val.gsub(q, q * 2) + q : val
345
350
  end
346
351
  end
347
352
  end.join(s) + "\n"
@@ -373,3 +378,16 @@ module FastererCSV
373
378
  end
374
379
  end
375
380
  end
381
+
382
+ data = <<-CSV
383
+ a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p
384
+ ,0,1,-1,0.0,1.1,-1.1,~1~,~~,~-1.1~,~1
385
+ .1~,x,~x~,,~1~~1~,
386
+ CSV
387
+ FastererCSV.parse(data, '~', ',', true, FastererCSV::NumericConversion.new)do |row|
388
+ h = row.to_hash
389
+ h.keys.sort{|a,b| a.to_s <=> b.to_s}.each do |k|
390
+ v = h[k]
391
+ puts "#{k} : #{v} : #{v.class}"
392
+ end
393
+ end
metadata CHANGED
@@ -1,13 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: fasterer-csv
3
3
  version: !ruby/object:Gem::Version
4
- hash: 11
4
+ hash: 9
5
5
  prerelease: false
6
6
  segments:
7
7
  - 0
8
8
  - 0
9
- - 10
10
- version: 0.0.10
9
+ - 11
10
+ version: 0.0.11
11
11
  platform: ruby
12
12
  authors:
13
13
  - Mason