Как изменить второй столбец файла CSV на основе первого столбца? - PullRequest
2 голосов
/ 06 марта 2011

Я новичок в 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;
}

Но мне не удается разобрать записи для использования ; в качестве разделителя и проверить, отсутствует ли поле имени, и, следовательно, вывести начало электронной почты без домена.

Может кто-нибудь дать мне пример на основе моего кода?

Ответы [ 3 ]

3 голосов
/ 06 марта 2011

Во-первых, если файл может содержать реальные данные 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);
0 голосов
/ 06 марта 2011

Попробуйте:

#!/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";
  }
}
0 голосов
/ 06 марта 2011

Я не жемчужный программист, но я бы сначала разделил символ пробела, а затем вы могли бы перебрать результаты и разделить точкой с запятой. Затем вы можете проверить второй элемент массива разбиения точки с запятой и, если он пуст, заменить его началом первого члена массива разделения точки с запятой. Затем просто измените процесс, сначала соединяя точки с запятой, а затем пробелы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...