2014-04-30 9 views
11

Ho un file TSV senza caratteri di preventivo. Ogni volta che si verifica un \t nei dati, è sempre necessario separare le colonne e mai una parte del valore di una colonna. Ogni volta che si verifica uno ", è sempre una parte del valore di una colonna e non deve mai includere valori di colonna.Come posso leggere CSV senza quote_char in ruby?

Vorrei leggere questo CSV in Ruby, ma mi dà

/Users/.rvm/rubies/ruby-1.9.3-p545/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift': Illegal quoting in line 9506. (CSV::MalformedCSVError) 

il mio codice è:

CSV.foreach(input_file, { :col_sep => "\t", :headers => true}) do |row| 
    puts row 
end 

Un modo per aggirare questo problema?

+0

Consiglio vivamente la gemma fastercsv da James Edward Grey II. Rende la vita più semplice. –

+0

possibile duplicato di [Importazione dell'errore di quotatura CSV mi sta facendo impazzire] (http://stackoverflow.com/questions/8073920/importing-csv-quoting-error-is-driving-me-nuts) –

+0

@ 6ftDan: la libreria standard csv in Ruby 1.9.3 * è * fastercsv AFAIK. –

risposta

25

Risulta che è possibile risolvere il problema inserendo quote_char => "\x00" in modo da indurlo a pensare che il byte zero sia la citazione.

1

Il liberal_parsing option è disponibile per casi come questo. Dalla documentazione:

Quando impostato su un valore vero, CSV tenterà di analizzare ingresso non conforme con la RFC 4180, come ad esempio le doppie virgolette nei campi non quotate.

Nel tuo esempio questo sarebbe:

CSV.foreach(input_file, { :col_sep => "\t", :headers => true, :liberal_parsing => true }) do |row| 
    puts row 
end