У меня есть 10 csv-файлов в массиве, и я хочу, чтобы количество строк каждого csv-файла использовало perl

#csv #perl

Вопрос:

У меня есть 10 CSV-файлов @files . Теперь я хочу подсчитать количество строк в каждом CSV-файле. Я попробовал приведенный ниже код, но он возвращает мне только количество CSV.

 my $directory = 'C:folder';
open "dir", $directory or die;
@files = readdir "dir";
close("dir");
 

Пожалуйста, помогите мне реализовать описанный выше сценарий.

Комментарии:

1. Если вы в Unix/Linux, то вы могли бы просто использовать wc -l file1 file2 file3 ... filen .

2. В некоторых случаях вы не можете просто считать строки, потому что поля в кавычках могут содержать новые строки.

Ответ №1:

Это может вам помочь:

 #!/usr/bin/perl

use strict; use warnings;

my $directory = "/path/to/the/directory/";
my @files = glob("$directory*.csv");

foreach my $file (@files){
    my $lines = 0;
    open (FILE, $file) or die "Can't open '$file': $!";
    $lines   while (<FILE>);
    close FILE;

    print "File:$file = $linesn";
}
 

Протестировал его в Ubuntu 20.04 (Perl v5.30.0).

Комментарии:

1. Почему бы не использовать my @lines = <FILE>; say scalar @lines ? Или вы ожидаете огромных файлов?

2. @PolarBear: Да, это тоже возможно.

Ответ №2:

Это часто задаваемые вопросы.

Как подсчитать количество строк в файле?

В ответе обсуждается ряд способов подхода к проблеме, прежде чем принимать решение:

Если вы не возражаете, команда wc обычно самая быстрая, даже с дополнительными накладными расходами на межпроцессные операции. Однако убедитесь, что у вас есть незапятнанное имя файла:

 #!perl -T

$ENV{PATH} = undef;

my $lines;
if( $filename =~ /^([0-9a-z_.] )z/ ) {
    $lines = `/usr/bin/wc -l $1`
    chomp $lines;
}