如何进行 CSV 记录拆分

How to do a CSV record split

我需要从 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

如果您的 CSV 文件有可能包含带引号的字段(这样每个字段本身可能包含一个逗号),那么您应该使用 Text::CSV to handle the data properly. However, for simple data like that in your question, it is fine to use just 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;

有一个 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