2012-03-25 10 views
28

Używam ruby ​​CSV.read z ogromnymi danymi. Od czasu do czasu spotkania biblioteczne źle sformatowane wiersze, na przykład:CSV.read Nielegalne cytowanie w linii x

"Illegal quoting in line 53657." 

Byłoby łatwiej ignorować linii i pominąć je, a następnie przejść przez każdego csv i naprawić formatowanie. Jak mogę to zrobić?

Odpowiedz

62

miałem ten problem w linii jak 123,456,a"b"c

Problemem jest parser CSV spodziewa ", jeśli pojawiają się one, aby całkowicie otoczyć tekst rozdzielany przecinkami.

Rozwiązanie użyć znak cudzysłowu oprócz " że byłam pewna, nie pojawiają się w moich danych:

CSV.read(filename, :quote_char => "|")

+1

w sytuacjach żądającego on konkretnie ma ogromne danych i po prostu chce pominąć błędy. Zmiana: quote_char właśnie pomogła mi w mojej sytuacji. –

+0

to działało również w mojej sytuacji, przebiegło przez ponad 100 linii danych CSV bez błędów. – DataHerder

+0

Awesomeness trwa również w 2015 roku :) Dzięki .. Wziąłem jak kilka godzin, aby dotrzeć tutaj :) – Suraj

5

Nie pozwól, aby CSV odczytało i przeanalizowało plik.

Wystarczy przeczytać plik samodzielnie i podać każdą linię do CSV.parse_line, a następnie rescue wszelkie wyjątki, które rzuca.

2

Opcja liberal_parsing już w Ruby 2.4 dla takich przypadkach. Z dokumentacji:

Kiedy ustawiony na true, CSV będzie próbował analizować dane wejściowe nie zgodnym z RFC 4180, takie jak cudzysłów w dziedzinach nienotowanych.

Aby ją włączyć, należy przekazać go jako opcja do CSV odczytu/analizowania/nowe metody:

CSV.read(filename, liberal_parsing: true) 
Powiązane problemy