Как я могу проанализировать загруженные данные CSV с Perl? - PullRequest
0 голосов
/ 04 октября 2010

Я пытаюсь загрузить файл .csv в массив и затем построчно проанализировать каждый столбец с помощью Text :: CSV. У меня есть следующее:

my @file = get("http://www.someCSV.com/file.csv") or warn $!;

my $CSV = Text::CSV->new();
$CSV->sep_char (',');

for ( @file ) {

  $CSV->parse($_) or warn $!;

      my @columns = $CSV->fields();
      print $columns[0] . "\n";
 }

Вместо того, чтобы загружать файл, сохранять его, а затем копировать его в дескриптор файла, я подумал, что было бы эффективнее просто поместить файл CSV в массив и проанализировать его. Однако приведенный выше код не работает, и я не понимаю, почему. Я получаю «Предупреждение: что-то не так в test.pl»; не очень полезно, если не сказать больше.

Это больше для обучения. Мне не нужно делать это таким образом, но меня просто беспокоит, почему я не могу использовать Text :: CSV с массивом.

1 Ответ

11 голосов
/ 04 октября 2010

Я предполагаю, что вы используете LWP::Simple функцию get.Это не возвращает список строк тела ответа, но строка, содержащая тело ответа.Итак, сначала вы, вероятно, имели в виду:

my $content = get($uri);

Теперь вы можете читать и читать эту строку за строкой, передавая каждую строку методу Text::CSV s parse.В некоторых случаях это может работать, но поскольку файлы CSV могут содержать встроенные символы новой строки, это не будет очень надежным.

Вместо этого позвольте Text::CSV выяснить, что именно является строкой на входе, передавэто дескриптор файла, который он может прочитать сам по себе.Для этого нет необходимости сохранять файл локально.Вы можете просто открыть дескриптор строки:

open my $fh, '<', \$content or die $!;

my $csv = Text::CSV->new({ sep_char => ',' });
while (my $row = $csv->getline($fh)) {
    my @fields = @{ $row };
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...