Какой надежный способ автоматического определения того, что файл на самом деле является CSV , если CSV был переопределен, чтобы обозначать «Значения, разделенные символами», то есть данные, использующие любой отдельный символ (но обычно любые не алфавитно-цифровыесимвол) как разделитель, а не только запятые?
По существу, с этим (пере) определением, CSV = DSV («Значения, разделенные разделителями»), обсуждаемые, например, в этом статья в Википедии , тогда как формат «Значения, разделенные запятыми» определен в RFC 4180 .
Более конкретно, существует ли метод для статистического вычитанияданные имеют как-то «фиксированную» длину , что означает «возможный CSV»?Простой подсчет количества разделителей не всегда работает, потому что существуют CSV-файлы с переменным числом полей на запись (т. Е. Записи, которые, в отличие от мандатов RFC 4180, не имеют одинакового количества полейчерез тот же файл).
Распознавание CSV представляется особенно сложной задачей, особенно если обнаружение не может быть основано на расширении файла (например, при чтении потока, который в любом случае не имеет такой информации).
Proper ("full ") Для автоопределения требуется как минимум 4 решения , которые должны быть приняты надежно:
- Обнаружение того, что файл действительно является CSV
- Обнаружение наличия заголовков
- Обнаружение фактического символа разделителя
- Обнаружение специальных символов (например, кавычек)
Полное автоопределение, похоже, не имеет единственного решения из-за сходства других наборов данных (например,произвольный текст, использующий запятые), особенно для угловых случаев, таких как записи переменной длины , поля с одинарными или двойными кавычками или многострочные записи.
Таким образом, наилучшим подходом, кажется, является телескопическаяобнаружение , в котором форматы, которые также могут быть классифицированы как CSV (например, форматы файлов журнала, такие как Apache CLF), проверяются перед применением.один из правил обнаружения CSV.
Даже коммерческие приложения, такие как Excel, похоже, полагаются на расширение файла (.csv), чтобы выбрать (1), что, очевидно, не является автоматическим определением, хотя проблема значительно упрощенаесли приложению сообщают, что данные представляют собой CSV.
Вот несколько хороших соответствующих статей, обсуждающих эвристику для (2) и (3):
Обнаружение (4), типа кавычек, может быть основано на обработке нескольких строк из файла и поиске соответствующих значений (например, четное число «или» в строке будет означать одинарные или двойные кавычки).Такая обработка может быть выполнена посредством инициализации существующего синтаксического анализатора CSV (например, OpenCSV ), который будет должным образом заботиться о разделении строк CSV (например, многострочные события).
Но как насчет (1), т. е. решив, что данные CSV в первую очередь?
Может ли data mining помочь в этом решении?