【问题标题】:How do I modify the second column of a CSV file based on the first column?如何根据第一列修改 CSV 文件的第二列?
【发布时间】:2011-03-07 05:08:50
【问题描述】:

我是 Perl 新手,我有一个包含电子邮件和姓名的 CSV 文件,如下所示:

john@domain1.com;John
Paul@domain2.com;
Richard@domain3.com;Richard
Rob@domain4.com;
Andrew@domain5.com;Andrew

但是,您可以看到一些条目/行包含电子邮件地址和 ; 字段分隔符,但缺少名称。我需要逐行阅读,如果缺少名称字段,我想在这个地方打印电子邮件的开头直到@domainX.com。输出示例:

john@domain1.com;John
Paul@domain2.com;Paul
Richard@domain3.com;Richard
Rob@domain4.com;Rob
Andrew@domain5.com;Andrew

我是 Perl 新手,我做了逐行读取的迭代,这样:

#!/usr/bin/perl
use warnings;
use strict;

open (MYFILE, 'test.txt');
while (<MYFILE>) {
    chomp;
}

但我无法解析条目以使用 ; 作为分隔符并检查名称字段是否丢失,从而打印不带域的电子邮件的开头。

有人可以根据我的代码给我一个例子吗?

【问题讨论】:

    标签: perl email csv


    【解决方案1】:

    首先,如果文件可能包含 real CSV(在您的情况下为空格 SV)数据(例如引用字段),我强烈建议使用标准 Perl 模块来解析它。

    否则,一个简单粗暴的例子可以是:

    #!/usr/bin/perl
    
    use warnings;
    use strict;
    
    # In modern Perl, please always use 3-aqr form of open and lexical filehandles.
    # More robust
    open $fh, "<", 'test.txt' || die "Can not open: $!\n";
    
    while (<$fh>) {
        chomp;
        my ($email, name) = split(/;/, $_);
        if (!$name) {
            my ($userid, $domain) = split(/\@/, $email);
            $name = $userid;
        }
        print "$space_prefix$email;$name\n"; # Print to STDOUT for simplicity of example
    }
    close($fh);
    

    【讨论】:

    • @Paul - 不客气。如果答案有帮助,请随时点击旁边的复选标记接受它
    【解决方案2】:

    试试:

    #!/usr/bin/env perl
    
    use strict;
    use warnings;
    
    for my $file ( @ARGV ){
    
      open my$in_fh, '<', $file or die "could not open $file: $!\n";
    
      while( my $line = <$in_fh> ){
        chomp( $line );
    
        my ( $email, $name ) = split m{ \; }msx, $line;
        if( ! ( defined $name && length( $name ) > 0 ) ){
          ( $name ) = split m{ \@ }msx, $email;
          $name = ucfirst( lc( $name ));
        }
    
        print "$email;$name\n";
      }
    }
    

    【讨论】:

      【解决方案3】:

      我不是珍珠程序员,但我会先拆分空格字符,然后您可以遍历结果并按分号拆分。然后可以检查分号拆分数组的第二个成员,如果为空,则将其替换为分号拆分数组第一个成员的开头。然后,只需反转该过程,首先用分号连接,然后用空格连接。

      【讨论】:

        猜你喜欢
        • 2017-08-25
        • 2015-06-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-12-02
        相关资源
        最近更新 更多