代码之家  ›  专栏  ›  技术社区  ›  bob george

如何分割CSV记录[重复]

  •  0
  • bob george  · 技术社区  · 10 年前

    我需要从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 回复  |  直到 10 年前
        1
  •  3
  •   Borodin    10 年前

    如果您的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
  •  -1
  •   L. D. James    10 年前

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

    您可以通过运行以下命令查看文本::CSV模块的其他功能:

    $ perldoc Text::CSV