fastercsv 0.1.3 → 0.1.4
Sign up to get free protection for your applications and to get access to all the features.
- data/CHANGELOG +5 -0
- data/Rakefile +1 -1
- data/TODO +27 -0
- data/lib/faster_csv.rb +17 -12
- data/test/tc_features.rb +7 -0
- metadata +2 -2
data/CHANGELOG
CHANGED
@@ -2,6 +2,11 @@
|
|
2
2
|
|
3
3
|
Below is a complete listing of changes for each revision of FasterCSV.
|
4
4
|
|
5
|
+
== 0.1.4
|
6
|
+
|
7
|
+
* Fixed <tt>:col_sep</tt> escaping bug (reported by Kev Jackson).
|
8
|
+
* Switched to the use of named parsers internally.
|
9
|
+
|
5
10
|
== 0.1.3
|
6
11
|
|
7
12
|
* Fixed typo in gem spec causing a require bug.
|
data/Rakefile
CHANGED
data/TODO
CHANGED
@@ -6,3 +6,30 @@ order.
|
|
6
6
|
* Add support for accessing fields by headers (from first row of document).
|
7
7
|
* Add "convertors" for switching numbers to Integers or Floats, dates to Date or
|
8
8
|
Time objects, etc.
|
9
|
+
* Add to_csv().
|
10
|
+
* Find a good headers solution for data like this:
|
11
|
+
"Experiment ID: 1",,,,,,,,,,,,
|
12
|
+
"Subject ID: 1013938829432171e868c340.
|
13
|
+
Trial,stimulus,time,type,field1,field2,text_response,Abs. time of
|
14
|
+
response,,,,,
|
15
|
+
26,undefined,14828,KEY,RETURN,UNUSED,DCS,Sat Oct 15 17:48:04 GMT-0400
|
16
|
+
2005,,,,,
|
17
|
+
23,undefined,15078,KEY,RETURN,UNUSED,244,Sat Oct 15 17:48:19 GMT-0400
|
18
|
+
2005,,,,,
|
19
|
+
7,nixontrialleft copy.pct [TAG: 1],5953,KEY,1,UNUSED,,Sat Oct 15
|
20
|
+
17:49:24 GMT-0400 2005,,,,,
|
21
|
+
8,nixontrialfront copy.pct [TAG: 3],6250,KEY,3,UNUSED,,Sat Oct 15
|
22
|
+
17:49:31 GMT-0400 2005,,,,,
|
23
|
+
9,nixontrialright copy.pct [TAG: 2],2469,KEY,2,UNUSED,,Sat Oct 15
|
24
|
+
17:49:34 GMT-0400 2005,,,,,
|
25
|
+
#####
|
26
|
+
more data
|
27
|
+
######
|
28
|
+
,,,,,,,,,,4374.347222,,
|
29
|
+
,,,,,,,,,,,,1.00
|
30
|
+
,,,,,,,,,,,,0.93
|
31
|
+
### and a new block starts
|
32
|
+
"Experiment ID: 3",,,,,,,,,,,,0.92
|
33
|
+
....
|
34
|
+
* Add FasterCSV.filter().
|
35
|
+
* Add calculated fields.
|
data/lib/faster_csv.rb
CHANGED
@@ -277,15 +277,20 @@ class FasterCSV
|
|
277
277
|
@row_sep = options[:row_sep]
|
278
278
|
|
279
279
|
# prebuild Regexps for faster parsing
|
280
|
-
@parsers =
|
281
|
-
|
282
|
-
|
283
|
-
|
284
|
-
|
285
|
-
|
286
|
-
|
287
|
-
|
288
|
-
|
280
|
+
@parsers = {
|
281
|
+
:leading_fields =>
|
282
|
+
/\A#{Regexp.escape(@col_sep)}+/, # for empty leading fields
|
283
|
+
:csv_row =>
|
284
|
+
### The Primary Parser ###
|
285
|
+
/ \G(?:^|#{Regexp.escape(@col_sep)}) # anchor the match
|
286
|
+
(?: "((?>[^"]*)(?>""[^"]*)*)" # find quoted fields
|
287
|
+
| # ... or ...
|
288
|
+
([^"#{Regexp.escape(@col_sep)}]*) # unquoted fields
|
289
|
+
)/x,
|
290
|
+
### End Primary Parser ###
|
291
|
+
:line_end =>
|
292
|
+
/#{Regexp.escape(@row_sep)}\Z/ # safer than chomp!()
|
293
|
+
}
|
289
294
|
end
|
290
295
|
|
291
296
|
### IO and StringIO Delegation ###
|
@@ -369,7 +374,7 @@ class FasterCSV
|
|
369
374
|
line += @io.gets(@row_sep) rescue return nil
|
370
375
|
# copy the line so we can chop it up in parsing
|
371
376
|
parse = line.dup
|
372
|
-
parse.sub!(@parsers[
|
377
|
+
parse.sub!(@parsers[:line_end], "")
|
373
378
|
|
374
379
|
#
|
375
380
|
# I believe a blank line should be an <tt>Array.new</tt>, not
|
@@ -381,7 +386,7 @@ class FasterCSV
|
|
381
386
|
# shave leading empty fields if needed, because the main parser chokes
|
382
387
|
# on these
|
383
388
|
#
|
384
|
-
csv = if parse.sub!(@parsers[
|
389
|
+
csv = if parse.sub!(@parsers[:leading_fields], "")
|
385
390
|
[nil] * $&.length
|
386
391
|
else
|
387
392
|
Array.new
|
@@ -390,7 +395,7 @@ class FasterCSV
|
|
390
395
|
# then parse the main fields with a hyper-tuned Regexp from
|
391
396
|
# Mastering Regular Expressions, Second Edition
|
392
397
|
#
|
393
|
-
parse.gsub!(@parsers[
|
398
|
+
parse.gsub!(@parsers[:csv_row]) do
|
394
399
|
csv << if $1.nil? # we found an unquoted field
|
395
400
|
if $2.empty? # switch empty unquoted fields to +nil+...
|
396
401
|
nil # for CSV compatibility
|
data/test/tc_features.rb
CHANGED
@@ -48,4 +48,11 @@ class TestFasterCSVFeatures < Test::Unit::TestCase
|
|
48
48
|
FasterCSV.parse_line( %Q{1,2,"3\n",4,5\r\n},
|
49
49
|
:row_sep => "\r\n") )
|
50
50
|
end
|
51
|
+
|
52
|
+
def test_bug_fixes
|
53
|
+
# failing to escape <tt>:col_sep</tt> (reported by Kev Jackson)
|
54
|
+
assert_nothing_raised(Exception) do
|
55
|
+
FasterCSV.new(String.new, :col_sep => "|")
|
56
|
+
end
|
57
|
+
end
|
51
58
|
end
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.8.11
|
|
3
3
|
specification_version: 1
|
4
4
|
name: fastercsv
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 0.1.
|
7
|
-
date: 2005-
|
6
|
+
version: 0.1.4
|
7
|
+
date: 2005-12-02 00:00:00 -06:00
|
8
8
|
summary: "FasterCSV is CSV, but faster, smaller, and cleaner."
|
9
9
|
require_paths:
|
10
10
|
- lib
|