Как мне надежно разобрать неправильно сформированный 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"