Присутствие автоматического обнаружения заголовков CSV в файле

Короткий вопрос: Как я автоматически обнаруживаю, имеет ли файл CSV заголовки в первой строке?

Подробнее: Я записал маленький механизм парсинга CSV, который помещает данные в объект, к которому я могу получить доступ (приблизительно) как база данных в оперативной памяти. Исходный код был написан для парсинга стороннего CSV с предсказуемым форматом, но я хотел бы смочь использовать этот код в более общем плане.

Я пытаюсь выяснить надежный способ автоматически обнаружить присутствие заголовков CSV, таким образом, сценарий может решить, использовать ли первую строку файла CSV как ключи / имена столбцов или начать анализировать данные сразу. Так как все, в чем я нуждаюсь, является булевым тестом, я мог легко указать аргумент после осмотра файла CSV сам, но я не буду скорее иметь к (пойдите, идут автоматизация).

Я предполагаю, что должен был бы проанализировать первые 3 к? строки файла CSV и ищут какой-то шаблон для сравнения с заголовками. У меня есть кошмары трех особенно тяжелых случаев в который:

  1. Заголовки включают числовые данные по некоторым причинам
  2. Первые несколько строк (или значительные части CSV) являются пустыми
  3. Там заголовки и данные выглядят слишком подобными, чтобы сказать им независимо

Если я могу получить "лучшее предположение" и иметь сбой синтаксического анализатора с ошибкой или выложить предупреждение, если он не может решить, это в порядке. Если это будет чем-то, что это будет чрезвычайно дорогим с точки зрения времени или вычисления (и займите больше времени, чем оно, как предполагается, сохраняет меня), то я счастливо фрагментирую идею и вернусь к работе над "важными вещами".

Я работаю с PHP, но это кажется мне больше алгоритмического / вычислительный вопрос, чем что-то, что это является определенным для реализации. Если существует простой алгоритм, я могу использовать, большой. Если бы можно указать на меня на некоторую соответствующую теорию / обсуждение, это было бы большим, также. Если существует гигантская библиотека, которая делает обработку естественного языка или 300 различных видов парсинга, мне не интересно.

19
задан cbednarski 19 April 2010 в 20:14
поделиться

4 ответа

Как отмечали другие, вы не можете сделать это со 100% надежностью. Однако бывают случаи, когда «в основном правильно» полезно - например, инструменты для работы с электронными таблицами с функцией импорта CSV часто пытаются разобраться в этом самостоятельно. Вот несколько эвристик, которые указывают на то, что первая строка не заголовок:

  • В первой строке есть столбцы, которые не являются строками или пусты.
  • Не все столбцы первой строки уникальны
  • Первая строка, похоже, содержит даты или другие распространенные форматы данных (например, xx-xx-xx)
15
ответ дан 30 November 2019 в 04:24
поделиться

В самом общем смысле это невозможно . Это действительный файл CSV:
Имя
Джим
Том
Билл

Большинство читателей CSV будут просто возьмите hasHeader в качестве опции и позвольте вам передать свой собственный заголовок, если хотите. Даже если вы думаете, что можете обнаружить, что это заголовки символов и числовые данные, вы можете столкнуться с катастрофическим отказом. Что, если ваша колонка представляет собой список серий BMW?
M
3
5
7

Вы обработаете это неправильно. Хуже всего то, что вы потеряете лучшую машину!

6
ответ дан 30 November 2019 в 04:24
поделиться

В чисто абстрактном смысле я не думаю, что существует надежный алгоритмический ответ на ваш вопрос, поскольку он сводится к следующему: «Как отличить dataA от dataB, если я ничего не знаю ни об одном из них?». Всегда существует вероятность того, что dataA будет неотличим от dataB. Тем не менее, я бы начал с простого и добавлял сложности только по мере необходимости. Например, при исследовании первых пяти строк для данного столбца (или столбцов), если все типы данных в строках 2-5 одинаковы, но отличаются от типа данных в строке 1, есть большая вероятность, что присутствует строка заголовка ( увеличенный размер выборки снижает вероятность ошибки). Это (вроде как) решит # 1 / # 3 - возможно, вызовет исключение, если все строки заполнены, но данные неразличимы, чтобы позволить вызывающей программе решить, что делать дальше. Для №2 просто не считайте строку как строку, пока она не извлечет ненулевые данные .... это будет работать во всех файлах, кроме пустого (в этом случае вы нажмете EOF). Это никогда не будет надежным, но может быть «достаточно близко».

3
ответ дан 30 November 2019 в 04:24
поделиться

Это действительно зависит от того, насколько «общим» вы хотите видеть свой инструмент. Если данные всегда будут числовыми, это будет легко, если вы используете нечисловые заголовки (что кажется довольно справедливым предположением).

Но помимо этого, если вы еще не знаете, какие закономерности присутствуют в данных, вы не можете проверить их заранее.

FWIW, на самом деле я просто написал сценарий для разбора некоторых вещей из TSV, все из одного источника. Подход источника к заголовкам / форматированию был настолько разрозненным, что имело смысл просто заставить скрипт задавать мне вопросы из командной строки во время выполнения. (Это заголовок? Какие столбцы важны?). Так что никакой автоматизации, но это позволяет мне пролистывать наборы данных, над которыми я работаю, вместо того, чтобы пытаться предугадывать каждый забавный случай форматирования. Кроме того, мои ответы сохраняются в файле, поэтому мне нужно участвовать только один раз для каждого файла. Не идеально, но эффективно.

1
ответ дан 30 November 2019 в 04:24
поделиться
Другие вопросы по тегам:

Похожие вопросы: