如何进行 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
我需要从 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