Как мне надежно разобрать неправильно сформированный CSV?

Я обрабатываю данные из государственных источников (FEC, государственные базы данных избирателей и т. Д.). Это неправильно искажено, что нарушает мой синтаксический анализатор CSV всеми видами восхитительных способов.

Это из внешних источников и авторитетный. Я должен разобрать его, и я не могу повторно ввести его, проверить на входе или тому подобное. Что есть, то есть; Я не контролирую ввод.

Свойства:

Fields contain malformed UTF-8 (e.g. Foo \xAB bar) The first field of a line specifies the record type from a known set. Knowing the record type, you know how many fields there are and their respective data types, but not until you do. Any given line within a file might use quoted strings ("foo",123,"bar") or unquoted (foo,123,bar). I haven't yet encountered any where it's mixed within a given line (i.e. "foo",123,bar) but it's probably in there. Strings may include internal newline, quote, and/or comma character(s). Strings may include comma separated numbers. Data files can be very large (millions of rows), so this needs to still be reasonably fast.

Я использую Ruby FasterCSV (известный как просто CSV в 1.9), но вопрос должен быть независимым от языка.

Я предполагаю, что решение потребует замены предварительной обработки однозначными символами разделения / кавычки записи (например, ASCII RS, STX). Я начал немногоВот но это не работает для всего, что я получаю.

Как я могу надежно обрабатывать такие грязные данные?

ETA: Вот упрощенный пример того, что может быть в одном файле:

"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"

Ответы на вопрос(3)

Ваш ответ на вопрос