如何进行CSV记录拆分

时间:2015-03-12 23:00:06

标签: arrays perl csv split field

我需要从CSV文件中获取特定字段并将其放入数组中。我不知道该怎么做。这是我到目前为止所尝试过的。

#!/usr/bin/perl

use strict;
use warnings;

my @array  = <>;
my @fields = split ",", @array;

print @fields[2];

这是CSV文件的示例

9988,Kathleen,Brown,kbrownc@goo.gl,OH,Female,Italian
9989,Antonio,Ford,afordb@bigcartel.com,IL,Male,
9990,Diana,Banks,dbanksa@jalbum.net,MA,Female,English

2 个答案:

答案 0 :(得分:3)

如果您的CSV文件有可能包含带引号的字段(以便每个字段本身可能包含逗号),那么您应该使用Text::CSV来正确处理数据。但是,对于您问题中的简单数据,只使用split

您的代码看起来像这样。请注意,通常不必将整个文件读入内存,逐行处理的内存效率更高。它还倾向于将程序员的注意力集中在一条线上,从而改善最终的设计。

use strict;
use warnings;

my @names;

while ( <> ) {
  chomp;
  my @fields = split /,/;
  push @names, $fields[2];
}

print "$_\n" for @names;

<强>输出

Brown
Ford
Banks

<强>更新

如果您对map感到满意,那么您可能更喜欢这个。它更加简洁,但是与你自己的代码一样效率低下,因为它会立即将整个文件读入内存(尽管它会立即再次丢弃它)。除非文件很大,否则不应该成为问题。

use strict;
use warnings;

my @names = map { chomp; ( split /,/ )[2]; } <>;

print "$_\n" for @names;

答案 1 :(得分:-1)

有一个perl模块可以处理许多文件格式,包括csv。您可以通过运行以下命令安装模块:

$ sudo cpan install Text::CSV;

现在,您将能够轻松地获得所需的逗号分隔符解析(这是默认设置)或指定任何其他字符。

安装perl模块后,这是一个快速完成任务的脚本。我创建了一个文本文件,其中包含名为test.csv的数据。

#!/usr/bin/perl

use strict;
use warnings;
require Text::CSV;

my $csv = Text::CSV->new;

open (DATA, "<test.csv") or die "Can't open file...";
while (<DATA>) {
    $csv->parse($_);
    my@fields = $csv->fields(); 
    print $fields[2];
}
close DATA;

您可以通过运行以下内容查看Text :: CSV模块的其他功能来查看文档:

$ perldoc Text::CSV