Mam niewiarygodny czas na zaimportowanie pliku CSV w Ruby-1.9.2.Importowanie błędu cytowania CSV doprowadza mnie do szału
Plik Próbuję analizować posiada:
- przecinki w kolumnach
- cudzysłowy pomiędzy kolumnami
- używa '@' jako: col_sep
csv.txt (reprezentatywne wejście, rzeczywisty to 101k linii):
㔾@㔾@jié@"seal" radical in Chinese characters, (Kangxi radical 26)
Mój kod:
require 'csv'
CSV.foreach("/Users/adam/Desktop/csvtest.txt", {:col_sep => "@"}) do |row|
puts row.to_s
end
My pożądane wyjście:
["㔾", "㔾", "jié", "\"seal\" radical in Chinese characters, (Kangxi radical 26)"]
Co mam wyjścia:
CSV::MalformedCSVError: Unclosed quoted field on line 1.
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1910:in `block in shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `loop'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1825:in `shift'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1767:in `each'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1202:in `block in foreach'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1340:in `open'
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/lib/ruby/1.9.1/CSV.rb:1201:in `foreach'
from (irb):31
from /Users/adam/.rvm/rubies/ruby-1.9.2-p290/bin/irb:16:in `<main>'
on mówi, że są niezamknięte notowane feilds, ale widzę, że Cytaty otwierają się i zamykają.
Ucieczka z cytatów nic nie robi. Otrzymuję ten sam błąd ([email protected]""seal"" r...
). Zmiana ich na pojedyncze cudzysłowy powoduje, że działa ([email protected]'seal' r...
). Problem polega na tym, że POTRZEBUJĘ, aby były w podwójnych cudzysłowach.
Wszelkie pomysły?
+1 Specyfikacja CSV jest tak całkowicie nadużywany i ignorowany, podobnie jak HTML. W obu przypadkach próbuję naprawić dane zanim oddam je do analizatora składni. Myślę, że byłoby to również rozwiązanie tego problemu, ale lubię, jak oszukujesz parser za pomocą 'quote_char =>" \ x00 "'. Dobra robota. –
Mam UTF-16 pochodzący z 'bcp' MSSQL dump, który faktycznie ma znak nul. Dla zabawy wybrałem postać bałwana (☃) jako zastępcę. :) –
Ten trik '' \ x00 "' działa pięknie :-) – Avishai