После тщательного изучения я обнаружил, что часть одной линии завернута в форму следующей строки. Как получить правильный счет?
Необходимо отобразить пример входящих данных, если вы хотите, чтобы мы помогли вам выполнить общие ответы.
Чтобы устранить проблему, вы должны уметь идентифицировать линию. Мы не можем вам помочь, потому что это может выглядеть как угодно. Сделав дикую догадку, я бы сказал, что в одном из столбцов была встроенная новая строка, которая заставляет линию обертывать.
Это файл является подлинным 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
будет содержать количество прочитанных строк. Память не будет затронута, и она будет работать как синие блейки на огромных файлах.
Что является источником завернутой линии? (Также: почему 'to_a', поскольку' readlines' уже возвращает 'Array' и почему' compact', так как 'readlines' не может содержать' nil' и почему 'to_i', поскольку' count' всегда возвращает a 'Fixnum') – Amadan
Почему вы заботитесь о числе * линий *? Разве количество * записей больше не имеет смысла? И если это записи, которые вы хотите, то почему бы вам не запустить ее через парсер CSV для подсчета записей? –
Вам нужно показать минимальный пример файла, включая соответствующую строку. См. [Как создать минимальный, полный и проверенный пример] (http://stackoverflow.com/help/mcve). –