Как я должен обнаружить, какой разделитель используется в текстовом файле?

Вам будет лучше использовать оператор * для построения вашей строки.

n = 4
for i in range(n):
    print('*' * (n-i))

Выход:

****
*** 
**
*
20
задан samiz 17 April 2009 в 19:59
поделиться

11 ответов

Вы можете показать им результаты в окне предварительного просмотра - подобно тому, как это делает Excel. Довольно ясно, когда в этом случае используется неправильный разделитель. Затем вы можете разрешить им выбирать диапазон разделителей и обновлять предварительный просмотр в режиме реального времени.

Затем вы можете просто сделать простое предположение о том, с чего начинать разделитель (например, сначала стоит запятая или табуляция).

14
ответ дан 29 November 2019 в 23:20
поделиться

Предполагая, что у вас есть стандартный набор столбцов, которые вы ожидаете ...

Я бы использовал FileHelper ( проект с открытым исходным кодом на SourceForge). http://filehelpers.sourceforge.net/

Определите два шаблона считывателя, один для запятых, один для вкладок.

Если первый сбой, попробуйте второй.

1
ответ дан 29 November 2019 в 23:20
поделиться

Нет «эффективного» пути.

1
ответ дан 29 November 2019 в 23:20
поделиться

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

1
ответ дан 29 November 2019 в 23:20
поделиться

По моему опыту, данные редко содержат вкладки, поэтому строка полей с разделителями табуляции будет (как правило) довольно очевидна.

Хотя запятые сложнее, особенно если вы читаете данные в неамериканских локалях. Числовые данные могут содержать огромное количество запятых, если вы читаете файлы, сгенерированные за пределами страны, поскольку числа с плавающей запятой часто содержат их.

В конце концов, единственная безопасная вещь, как правило, это попытаться, а затем представить ее пользователю и разрешите им настраиваться, особенно если ваши данные будут содержать запятые и / или вкладки.

1
ответ дан 29 November 2019 в 23:20
поделиться

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

1
ответ дан 29 November 2019 в 23:20
поделиться

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

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

2
ответ дан 29 November 2019 в 23:20
поделиться

Просто прочитайте несколько строк, посчитайте количество запятых и количество вкладок и сравните их. Если есть 20 запятых и нет вкладок, это в CSV. Если есть 20 вкладок и 2 запятые (возможно, в данных), это в TSV.

2
ответ дан 29 November 2019 в 23:20
поделиться

Знаете ли вы, сколько полей должно присутствовать в каждой строке? Если это так, я бы прочитал первые несколько строк файла и проверил на основании этого.

По моему опыту, «нормальные» данные довольно часто содержат запятые, но редко содержат символы табуляции. Это говорит о том, что вам следует проверить постоянство количества вкладок в первых нескольких строках и выбрать этот вариант в качестве предпочтительного варианта. Конечно, это зависит от того, какие именно данные у вас есть.

В конечном счете, вполне возможно иметь файл, который полностью подходит для обоих форматов, поэтому вы не можете сделать его абсолютно надежным. Это должна быть работа "с максимальным усилием".

4
ответ дан 29 November 2019 в 23:20
поделиться

В Python, в модуле csv есть класс Sniffer, который можно использовать для угадывания данного разделителя файла и символов кавычек. Его стратегия (цитируется из строки документации csv.py):


[Сначала посмотрите] текст, заключенный между двумя одинаковыми кавычками (вероятный цитата), которые предшествуют и следуют одним и тем же символом (вероятный разделитель). Например:

         ,'some text',

Цитата с наибольшим количеством побед, то же самое с разделителем. Если кавычка нет, разделитель не может быть определен

В этом случае попробуйте следующее:

Разделитель должен встречаться такое же число раз на каждый ряд. Однако из-за искаженных данных это может и не произойти. Мы не хотим подход «все или ничего», поэтому мы допускаем небольшие изменения в этом номер.

  1. построить таблицу частоты каждый символ в каждой строке.
  2. построить таблицу частот этого частота (мета-частота?), например х произошел 5 раз в 10 строках, 6 раз в 1000 строк, 7 раз в 2 строки
  3. используют режим мета-частоты определить ожидаемый Частота для этого символа
  4. узнать, как часто персонаж на самом деле отвечает этой цели
  5. персонаж, который лучше всего соответствует его цель - разделитель

По соображениям производительности данные оцениваются порциями, поэтому они могут попытаться оценить наименьшую часть возможных данных, оценивая дополнительные куски по мере необходимости.


Я не собираюсь цитировать здесь исходный код - он находится в каталоге Lib каждой установки Python.

Помните, что CSV также может использовать точки с запятой вместо запятых в качестве разделителей (например, в немецких версиях Excel, CSV разделены точкой с запятой, потому что запятые используются в качестве десятичных разделителей в Германии ...)

15
ответ дан 29 November 2019 в 23:20
поделиться

Он написан на PHP, но выглядит довольно надежно:

$csv = 'something;something;something
someotherthing;someotherthing;someotherthing
';
$candidates = array(',', ';', "\t");
$csvlines = explode("\n", $csv);
foreach ($candidates as $candidatekey => $candidate) {
 $lastcnt = 0;
 foreach ($csvlines as $csvline) {
  if (strlen($csvline) <= 2) continue;
  $thiscnt = substr_count($csvline, $candidate);
  if (($thiscnt == 0) || ($thiscnt != $lastcnt) && ($lastcnt != 0)) {
   unset($candidates[$candidatekey]);
   break;
  }
  $lastcnt = $thiscnt;
 }
}
$delim = array_shift($candidates);
echo $delim;

Он делает следующее: Для каждого указанного возможного разделителя он считывает каждую строку в CSV и проверяет, является ли число повторений каждого разделителя постоянным. Если нет, разделитель-кандидат удаляется, и в конечном итоге вы должны получить один разделитель.

3
ответ дан 29 November 2019 в 23:20
поделиться
Другие вопросы по тегам:

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