【问题标题】:How to do a CSV record split [duplicate]如何进行 CSV 记录拆分 [重复]
【发布时间】:2015-05-15 07:50:56
【问题描述】:

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

【问题讨论】:

  • 所以你想要一个所有姓氏的列表?

标签: arrays perl csv split field


【解决方案1】:

如果您的 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;

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 不要像那样弄乱系统的perl。如果您有sudo,并且您的发行版有该模块的包,请使用它。否则,只需使用多种替代方法之一,即可保护系统的perl 不受伤害。
    • 我在回答问题时花时间测试我的建议。 Borodin 在他的回答中似乎对这个有价值的 perl 模块有类似的暗示,我在发布答案后注意到了这一点。碰巧在测试建议时,该模块未安装在我用于测试的机器上。我想拥有 sudo 访问权限的用户可能正在安装程序(例如 perl)以供系统广泛使用。就我而言,我使用我的 perl 脚本来运行许多系统任务。如果 perl 没有在系统范围内升级,我的程序/工具将会损坏。
    • 有些人在反对投票时是rude。我花了很多时间测试一个简单可行的解决方案。 It's not off topic。它会很好用。它还包括一行向用户展示如何使用非常广泛的 CSV 功能。如果我花更少的时间格式化以使我的答案清晰易懂,那将是第一个发布的答案,并且很可能已收到原始复选标记。我赞扬打字速度更快的大师。他的回答暗示了该模块的优点。我的回答准确地展示了如何使用它,其中I'm sure many people will benefit.
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多