2014-12-01 2 views
0

У меня большой CSV с большим количеством столбцов. Я пытаюсь подсчитать количество строк, используяКоличество строк в csv не соответствует

File.open(file).readlines.to_a.compact.count.to_i 

Он отображает 57, хотя есть только 56 строк. После тщательного изучения я обнаружил, что часть одной строки завернута, чтобы сформировать следующую строку. Как получить правильный счет?

+0

Что является источником завернутой линии? (Также: почему 'to_a', поскольку' readlines' уже возвращает 'Array' и почему' compact', так как 'readlines' не может содержать' nil' и почему 'to_i', поскольку' count' всегда возвращает a 'Fixnum') – Amadan

+0

Почему вы заботитесь о числе * линий *? Разве количество * записей больше не имеет смысла? И если это записи, которые вы хотите, то почему бы вам не запустить ее через парсер CSV для подсчета записей? –

+0

Вам нужно показать минимальный пример файла, включая соответствующую строку. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –

ответ

0

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

Необходимо отобразить пример входящих данных, если вы хотите, чтобы мы помогли вам выполнить общие ответы.

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

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

Ваш лучший выбор - использовать класс CSV, который поставляется с Ruby, и позволить ему прочитать файл, вместо того, чтобы рассматривать его как текстовый файл. CSV-файлы являются текстовыми, но они отформатированы для поддержки столбцов и строк, поэтому использование класса CSV даст вам больше шансов получить данные.


Глядя на ваш код:

Есть несколько способов, чтобы подсчитать количество строк в файле, в том числе самый простой, который является:

`wc -l /path/to/file`.to_i 

если вы используете * Никс.

Использование File.open(file).readlines.to_a является ужасно избыточным, а не быстрым или масштабируемым, если ваш файл большой.

  • readlines возвращает массив.
  • to_a возвращает массив.

Зачем включать массив в массив?

readlines загружает весь файл в память, а затем разбивает его на концы строки в массив. Этот процесс может быть намного медленнее, чем просто читать файл по очереди и увеличивать счетчик, а также «разрывать» может заставить вашу программу сканировать, если файл больше доступной памяти.

См. "Why is "slurping" a file not a good practice?" для получения дополнительной информации.

compact удаляет нильс из массива. readlines никогда не должен возвращать ники, поэтому compact будет перебирать массив, ищущий то, что не должно существовать.

  • count возвращает целое число.
  • to_i преобразует приемник в целое число.

Иными словами, to_i превращает целое число в целое число. Зачем?

Если вы хотите сделать это в Ruby, вместо того, чтобы использовать wc -l, сделать что-то простое и быстрое:

lines_in_file = 0 
File.foreach(some_file) { lines_in_file += 1 } 

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

Смежные вопросы