Я обрабатываю данные из правительственных источников (FEC, базы данных государственных избирателей и т.д.). Он непоследовательно искажен, что ломает мой синтаксический анализатор CSV всякими восхитительными способами.
Он внешне получен и авторитетен. Я должен разобрать его, и я не могу его повторно вводить, проверять на входе и т.п. Что есть, то есть; Я не контролирую ввод.
Свойства:
- Поля содержат неверный UTF-8 (например,
Foo \xAB bar
) - Первое поле строки указывает тип записи из известного набора. Зная тип записи, вы знаете, сколько полей есть и их соответствующие типы данных, но только после этого.
- Любая строка в файле может использовать цитируемые строки (
"foo",123,"bar"
) или некорректные (foo,123,bar
). Я еще не сталкивался с тем, где он смешивался в данной строке (т.е."foo",123,bar
), но он, вероятно, там. - Строки могут содержать внутренние символы новой строки, цитаты и/или запятой.
- Строки могут содержать номера, разделенные запятыми.
- Файлы данных могут быть очень большими (миллионы строк), поэтому это должно быть достаточно быстро.
Я использую 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"