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"

questionAnswers(3)

yourAnswerToTheQuestion