 
 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 |