2014-06-27 132 views
0

我想解析頭行在第8行的文件。第9行是我的數據。我如何使用Text::CSV來做到這一點?我有麻煩,我的代碼如下:使用Text :: CSV解析CSV

my @cols = @{$csv->getline($io, 8)}; 
my $row = {}; 
$csv->bind_columns (\@{$row}{@cols}); 


while($csv->getline($io, 8)){ 


    my $ip_addr = $row->{'IP'}; 

} 
+0

你能給從CSV幾行文件的例子嗎? – AKHolland

+0

前幾行是垃圾數據。我不需要第8行,它包含頭(IP,DNS,MAC等)。然後在它下面有每行主機的信息。 – eagles02

+0

閱讀標題行之前,有一些內容符合'readline $ io for 1..7'的含義。 –

回答

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: $!"; 
1

你死心塌地使用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_addr\n"; 
} 
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