首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Text::CSV解析CSV

使用Text::CSV解析CSV
EN

Stack Overflow用户
提问于 2014-06-27 23:44:14
回答 2查看 363关注 0票数 0

我正在尝试解析一个文件,其中标题行在第8行。从第9行到第n行是我的数据。我如何使用Text::CSV来做这件事?我遇到麻烦了,我的代码如下:

代码语言:javascript
复制
my @cols = @{$csv->getline($io, 8)};
my $row = {};
$csv->bind_columns (\@{$row}{@cols});


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


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

}
EN

回答 2

Stack Overflow用户

发布于 2014-06-28 03:52:51

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2014-06-28 11:39:45

你是不是一心想用bind_columns了?我想我明白您想要做什么了,这在概念上非常有创意,但是如果您想要的是一种通过标题名称引用列的方法,不如这样:

代码语言:javascript
复制
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;

示例输入:

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24455827

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档