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

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

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

Свойства:

  1. Поля содержат неверный формат UTF -8 (, например.Foo \xAB bar)
  2. Первое поле строки указывает тип записи из известного набора. Зная тип записи, вы знаете, сколько там полей и соответствующих им типов данных, но не раньше, чем вы это сделаете.
  3. Любая заданная строка в файле может использовать строки в кавычках("foo",123,"bar")или без кавычек(foo,123,bar). Я еще не встречал ни одного случая, когда он смешивается в пределах заданной строки (, т.е."foo",123,bar)но это, вероятно, там.
  4. Строки могут включать внутреннюю новую строку, кавычки и/или символы запятой (s ).
  5. Строки могут включать числа, разделенные запятыми.
  6. Файлы данных могут быть очень большими (миллионов строк ), поэтому это должно быть достаточно быстрым.

Я использую 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"

15
задан Sai 31 July 2012 в 21:21
поделиться