Jak solidnie analizować zniekształcony CSV?
Przetwarzam dane ze źródeł rządowych (FEC, stanowe bazy danych wyborców itp.). Jest niespójnie zniekształcony, co powoduje łamanie mojego parsera CSV na wiele sposobów.
Jest pozyskiwany z zewnątrz i autorytatywny. Muszę go przeanalizować i nie mogę go ponownie wprowadzić, zatwierdzić na wejściu lub tym podobnych. Jest jak jest; Nie kontroluję wejścia.
Nieruchomości:
Pola zawierają zniekształcony kod UTF-8 (np.Foo \xAB bar
)Pierwsze pole linii określa typ rekordu ze znanego zestawu. Znając typ rekordu, wiesz, ile pól jest i jakie są ich typy danych, ale nie aż do momentu.Każda dana linia w pliku może zawierać cytowane łańcuchy ("foo",123,"bar"
) lub nienotowane (foo,123,bar
). Nie spotkałem się jeszcze z żadnym miejscem, w którym byłby zmieszany w danej linii (tj."foo",123,bar
) ale prawdopodobnie tam jest.Ciągi mogą zawierać wewnętrzny znak nowej linii, cytat i / lub przecinek.Ciągi mogą zawierać liczby oddzielone przecinkami.Pliki danych mogą być bardzo duże (miliony wierszy), więc musi to nadal być dość szybkie.Używam Ruby FasterCSV (znanego jako CSV w wersji 1.9), ale pytanie powinno być agnostyczne językowo.
Domyślam się, że rozwiązanie będzie wymagało podstawienia przetwarzania wstępnego za pomocą jednoznacznych znaków separujących rekordy / cytatów (np. ASCII RS, STX). Zacząłem trochętutaj ale to nie działa na wszystko, co otrzymuję.
Jak mogę solidnie przetworzyć tego rodzaju brudne dane?
ETA: Oto uproszczony przykład tego, co może być w jednym pliku:
"this","is",123,"a","normal","line" "line","with "an" internal","quote" "short line","with an "internal quote", 1 comma and linebreaks" un "quot" ed,text,with,1,2,3,numbers "quoted","number","series","1,2,3" "invalid \xAB utf-8"