This page contains automated test results for code from O'Reilly's Ruby Cookbook. If this code looks interesting or useful, you might want to buy the whole book.
Parsing Not-Quite-Comma-Separated Data | ||
---|---|---|
Code | Expected | Actual |
require 'csv' pipe_separated="1|2ENDa|bEND" CSV::Reader.parse(pipe_separated, '|', 'END') { |r| r.each { |c| puts c } } |
1 2 a b |
1 2 a b |
require 'rubygems' require 'faster_csv' FasterCSV.parse(pipe_separated, :col_sep=>'|', :row_sep=>'END') do |r| r.each { |c| puts c } end |
1 2 a b |
1 2 a b |
data = [[1,2,3],['A','B','C'],['do','re','mi']] open('first3.csv', 'w') do |output| CSV::Writer.generate(output, ':', '-END-') do |writer| data.each { |x| writer << x } end end open('first3.csv') { |input| input.read() } |
"1:2:3-END-A:B:C-END-do:re:mi-END-" | "1:2:3-END-A:B:C-END-do:re:mi-END-" |
FasterCSV.open('first3.csv', 'w', :col_sep=>':', :row_sep=>'-END-') do |output| data.each { |x| output << x } end open('first3.csv') { |input| input.read() } |
"1:2:3-END-A:B:C-END-do:re:mi-END-" | "1:2:3-END-A:B:C-END-do:re:mi-END-" |
class MyFasterCSV < FasterCSV def init_parsers(options) super @parsers[:csv_row] = / \G(?:^|#{Regexp.escape(@col_sep)}) # anchor the match (?: '((?>[^']*)(?>''[^']*)*)' # find quoted fields | # ... or ... ([^'#{Regexp.escape(@col_sep)}]*) # unquoted fields )/x end end #Regexp.new(@parsers[:csv_row].source.gsub('"', "'")) MyFasterCSV.parse("1,'2,3',4") { |r| puts r } |
1 2,3 4 |
1 2,3 4 |
missing_quotes=%{20051002, Alice says, "I saw that!"} CSV::Reader.parse(missing_quotes) { |r| r.each { |c| puts c } } |
CSV::IllegalFormatError: CSV::IllegalFormatError ... |
CSV::IllegalFormatError: CSV::IllegalFormatError from /usr/lib/ruby/1.8/csv.rb:607:in `get_row' from /usr/lib/ruby/1.8/csv.rb:556:in `each' from /usr/lib/ruby/1.8/csv.rb:531:in `parse' from (irb):34 |
unescaped_quotes=%{20051002, "Alice says, "I saw that!""} FasterCSV.parse(unescaped_quotes) { |r| r.each { |c| puts c } } |
FasterCSV::MalformedCSVError: Unclosed quoted field. ... |
FasterCSV::MalformedCSVError: Unclosed quoted field. from /usr/lib/ruby/gems/1.8/gems/fastercsv-0.1.9/lib/faster_csv.rb:885:in `shift' from /usr/lib/ruby/gems/1.8/gems/fastercsv-0.1.9/lib/faster_csv.rb:830:in `shift' from /usr/lib/ruby/gems/1.8/gems/fastercsv-0.1.9/lib/faster_csv.rb:795:in `each' from /usr/lib/ruby/gems/1.8/gems/fastercsv-0.1.9/lib/faster_csv.rb:597:in `parse' from (irb):36 |