Как подсчитать количество строк в большом файле CSV с помощью Perl? - PullRequest
3 голосов
/ 15 апреля 2009

Я должен использовать Perl в среде Windows на работе, и мне нужно иметь возможность узнать количество строк, которые содержит большой CSV-файл (около 1,4 ГБ) Любая идея, как это сделать с минимальной тратой ресурсов?

Спасибо

PS Это должно быть сделано в скрипте Perl, и нам не разрешено устанавливать какие-либо новые модули в систему.

Ответы [ 6 ]

14 голосов
/ 15 апреля 2009

Вы имеете в виду линии или строки? Ячейка может содержать разрывы строк, которые добавляют строки в файл, но не строки. Если вам гарантировано, что ни одна ячейка не содержит новых строк, просто используйте метод из Perl FAQ . В противном случае вам потребуется правильный анализатор CSV, например Text :: xSV .

9 голосов
/ 15 апреля 2009

Да, не используйте Perl.

Вместо этого используйте простую утилиту для подсчета строк; wc.exe

Он является частью набора утилит windows , портированных с оригиналов Unix.

http://unxutils.sourceforge.net/

Например;

PS D:\> wc test.pl
     12      26     271 test.pl
PS D:\>

Где 12 == количество строк, 26 == количество слов, 271 == количество символов.

Если вам действительно нужно использовать perl;

D:\>perl -lne "END{print $.;}" < test.pl
12
4 голосов
/ 15 апреля 2009
perl -lne "END { print $. }" myfile.csv

Это читает только одну строку за раз, поэтому он не тратит впустую память, если каждая строка не очень длинная.

3 голосов
/ 15 апреля 2009

Этот однострочный обрабатывает новые строки в строках:

  1. Учитывая строки с нечетным количеством кавычек.
  2. Учитывая, что двойные кавычки - это способ указания кавычек в поле.
  3. Используется потрясающий оператор триггера.

    perl -ne 'BEGIN{$re=qr/^[^"]*(?:"[^"]*"[^"]*)*?"[^"]*$/;}END{print"Count: $t\n";}$t++ unless /$re/../$re/'
    

Рассмотрим:

  • wc не собирается работать. Это здорово для подсчета строк, но не CSV строк
  • Вы должны установить - или бороться за установку - Text::CSV или какой-то аналогичный стандартный пакет для правильной обработки.
  • Тем не менее, это может привести вас туда.

<ч /> РЕДАКТИРОВАТЬ: Мне показалось, что это были окна:

perl -ne "BEGIN{$re=qr/^[^\"]*(?:\"[^\"]*\"[^\"]*)*?\"[^\"]*$/;}END{print qq/Count: $t\n/;};$t++ unless $pq and $pq = /$re/../$re/;"

Странная вещь заключается в том, что оболочка The Broken OS интерпретирует && как условный исполнитель ОС, и я ничего не мог сделать, чтобы изменить его мнение !! Если бы я избежал этого, он просто прошел бы это тот путь к Perl.

0 голосов
/ 16 апреля 2009

Я был идиотом, простой способ сделать это в сценарии:

open $extract, "<${extractFileName}" or die ("Cannot read row count of $extractFileName");
$rowCount=0;    
while (<$extract>)
{
    $rowCount=$rowCount+1;
}

close($extract);
0 голосов
/ 15 апреля 2009

Upvote для ответа edg, другой вариант - установить cygwin , чтобы получить wc и кучу других полезных утилит в Windows.

...