[lnkForumImage]
TotalShareware - Download Free Software

Confronta i prezzi di migliaia di prodotti.
Asp Forum
 Home | Login | Register | Search 


 

Forums >

comp.lang.ruby

Chaning the quote-character in csv parsing

Jens Auer

3/28/2006 1:58:00 PM

Hi,
I have a bunch of files containing lines as comma-seperated values.
Unfortunately, the character used for quoting is a single quote (') and
not the double quote ("). How can I tell the csv library (or fastercsv
or any other csv-parsing library) which character is used for quoting?
Some of the files contain fields like 'quoted, but with comma', which
are seperated into two fields at the comma:
irb(main):003:0> line = "one, 'quoted', 'quoted, but with comma'"
=> "one, 'quoted', 'quoted, but with comma'"
irb(main):006:0> CSV::parse_line('some words "some quoted text" some
more words', ' ')
=> ["some", "words", "some quoted text", "some", "more", "words"]
irb(main):001:0> require 'rubygems'
=> true
irb(main):002:0> require_gem 'fastercsv'
=> true
irb(main):004:0> line.parse_csv
=> ["one", " 'quoted'", " 'quoted", " but with comma'"]

The output should be ["one", "'quoted'", "'quoted, but with comma'"]
1 Answer

James Gray

3/28/2006 4:04:00 PM

0

On Mar 28, 2006, at 8:03 AM, Jens Auer wrote:

> I have a bunch of files containing lines as comma-seperated values.
> Unfortunately, the character used for quoting is a single quote (')
> and not the double quote ("). How can I tell the csv library (or
> fastercsv or any other csv-parsing library) which character is used
> for quoting?

I'm not aware of a way to change it for either library, sadly. If
your data is simple, you might get away with manipulating it into shape:

>> require "csv"
=> true
>> line = "one,'quoted','quoted, but with comma'"
=> "one,'quoted','quoted, but with comma'"
>> CSV.parse_line(line.tr("'", '"'))
=> ["one", "quoted", "quoted, but with comma"]

Unfortunately, on of the examples you showed is more complicated than
that:

>> line = 'some words "some quoted text" some more words'
=> "some words \"some quoted text\" some more words"
>> CSV.parse_line('"' + line.gsub('"', '""').tr("'", '"') + '"')
=> ["some words \"some quoted text\" some more words"]

Those transforms need to be done on a field by field basis though, to
correctly convert data like that.

Hope that helps.

James Edward Gray II