#perl #parsing #csv
#perl #синтаксический анализ #csv
Вопрос:
Я пытаюсь проанализировать файл, строка заголовка которого находится в строке 8. Из строки 9-n — это мои данные. Как я могу использовать Text::CSV
для этого? У меня возникли проблемы, мой код приведен ниже:
my @cols = @{$csv->getline($io, 8)};
my $row = {};
$csv->bind_columns (@{$row}{@cols});
while($csv->getline($io, 8)){
my $ip_addr = $row->{'IP'};
}
Комментарии:
1. Можете ли вы привести пример нескольких строк из файла CSV?
2. Первые несколько строк представляют собой ненужные данные. Мне ничего не нужно до строки 8, где он содержит заголовки (IP, DNS, MAC … и т.д.). Затем ниже приведена информация для каждого узла строка за строкой.
3. Что-то вроде
readline $io for 1 .. 7
, прежде чем читать строку заголовка?4. Я новичок в text :: csv. Я не совсем уверен, что мне нужно сделать, чтобы извлечь строку заголовка и привязать к ней строки данных.
5.
getline_all
(получает все записи) должно бытьgetline
(получает запись), для начала.
Ответ №1:
use Text::CSV;
my $csv = Text::CSV->new( ) or die "Cannot use CSV: ".Text::CSV->error_diag ();
open my $io, "test.csv" or die "test.csv: $!";
my $array_ref = $csv->getline_all($io, 8);
my $record = "";
foreach $record (@$array_ref) {
print "$record->[0] n";
}
close $io or die "test.csv: $!";
Ответ №2:
Вы намертво настроены на использование bind_columns? Я думаю, я понимаю, что вы пытаетесь сделать, и это условно очень креативно, но если все, что вам нужно, это способ ссылаться на столбец по имени заголовка, как насчет чего-то вроде этого:
use strict;
use warnings;
use Text::CSV;
my $csv = Text::CSV->new ( { binary => 1 } );
my (%header);
open my $io, "<", '/var/tmp/foo.csv' or die $!;
while (my $row = $csv->getline ($io)) {
next unless $. > 7;
my @fields = @$row;
unless (%header) {
$header{$fields[$_]} = $_ for 0..$#fields;
next;
}
my $ip_addr = $fields[$header{'IP'}];
print "$. => $ip_addrn";
}
close $io;
Пример ввода:
Test Data,,,
Trash,,,
Test Data,,,
Trash,,,
Beans,Joe,10.224.38.189,XYZ
Beans,Joe,10.224.38.190,XYZ
Beans,Joe,10.224.38.191,XYZ
Last Name,First Name,IP,Computer
Beans,Joe,10.224.38.192,XYZ
Beans,Joe,10.224.38.193,XYZ
Beans,Joe,10.224.38.194,XYZ
Beans,Joe,10.224.38.195,XYZ
Beans,Joe,10.224.38.196,XYZ
Beans,Joe,10.224.38.197,XYZ
Вывод:
9 => 10.224.38.192
10 => 10.224.38.193
11 => 10.224.38.194
12 => 10.224.38.195
13 => 10.224.38.196
14 => 10.224.38.197