Каким будет надежный способ автоматического определения того, что файл является фактически CSV, если CSV было переопределено, чтобы означать "значения, разделенные символами", то есть данные с использованием любого отдельного символа (но обычно любые не- буквенно-цифровой символ) как разделитель, а не только запятые?
По существу, с этим (re) определением CSV = DSV ( "Разделяемые разделителем значения" ), обсуждаемые, например, в этом Статья в Википедии, тогда как формат "Comma Separated Values " определен в RFC 4180.
В частности, существует ли метод статистического вычитания того, что данные имеют как-то "фиксированную" длину, что означает "возможный CSV"? Простое подсчет количества разделителей не всегда работает, потому что есть CSV файлы с переменными числами полей на запись (т.е. Записи, которые, напротив, соответствуют мандатам RFC 4180, не имеют одинакового числа поля в одном файле).
Распознавание CSV представляется особенно сложной задачей, особенно если обнаружение не может основываться на расширении файла (например, при чтении потока, который не имеет такой информации).
Для правильного ( "полного" ) автоматического определения требуется не менее 4 решений:
- Обнаружение того, что файл на самом деле является CSV
- Обнаружение наличия заголовков
- Обнаружение фактического символа разделителя
- Обнаружение специальных символов (например, кавычек)
Полное автоопределение, кажется, не имеет единого решения из-за сходства других наборов данных (например, свободного текста, который использует запятые), особенно для таких угловых случаев, как записи переменной длины, одинарные или двойные кавычки, или многострочные записи.
Таким образом, наилучшим подходом является телескопическое обнаружение, в котором форматы, которые также могут быть классифицированы как CSV (например, форматы файлов журнала, такие как Apache CLF), рассматриваются до применения CSV правила обнаружения.
Даже коммерческие приложения, такие как Excel, полагаются на расширение файла (.csv), чтобы решить (1), что, очевидно, не является автоопределением, хотя проблема значительно упрощена, если в заявлении говорится, что данные являются CSV.
Вот некоторые хорошие статьи, посвященные эвристике для (2) и (3):
- Автоопределение заголовков (Java)
- Автоопределение разделителя (С#)
- Автоопределение заголовков и разделителей (Ruby)
Обнаружение (4), тип кавычек, может быть основано на обработке нескольких строк из файла и поиске соответствующих значений (например, четное число "или" для каждой строки будет означать одиночные или двойные кавычки) Такая обработка может быть выполнена путем инициализации существующего анализатора CSV (например, OpenCSV), который будет должным образом учитывать разделение строк CSV (например, многострочные события).
Но как насчет (1), т.е. решая, что данные CSV в первую очередь?
Помогла ли интеллектуальная обработка данных помощь в этом решении?