开发者

How do I modify the second column of a CSV file based on the first column?

I'm new to Perl and I have a CSV file that contains e-mails and names, like this:

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

However, as you can see a few entries/lines have the e-mail address and the ; field separator, but lack the name. I need to read line by line and and if the name field is missing, I want to print in this place the begin of the e-mail until @domainX.com. Output example:

john@domain1.com;John
Paul@domain2.com;Paul
Richard@domain3.com;Richard
开发者_StackOverflow中文版Rob@domain4.com;Rob
Andrew@domain5.com;Andrew

I'm new with Perl, I did the iteration of read line by line, such this:

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

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

But I'm failing to parse the entries to use ; as a separator and to check if the name field is missing and consequently print the begin of the e-mail without the domain.

Can someone please give me a example based on my code?


First, if the file may contain real CSV (or space SV in your case) data (e.g. quoted fields), I'd strongly recommend using a standard Perl module to parse it.

Otherwise, a quick-and-dirty example can be:

#!/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);


Try:

#!/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";
  }
}


I am not a pearl programmer, but I would split first on the space character, and then you could iterate through the results and split by the semi-colon. Then you can check the second member of the semi-colon split array, and if it is empty, replace it with the beginning of the first member of the semi-colon split array. Then, just reverse the process, first joining by semi-colons and then by spaces.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜