2011-04-19 65 views
2

我试图编写一个perl脚本来解析目录中充满电子邮件并提取电子邮件地址和相应的名称。提取电子邮件地址和名称

现在我解析单词“From:”,然后提取行,但这是我卡住的地方。

的数据可以采用以下格式:

> From: "Smith, John" <[email protected]> 
> From: John Smith <[email protected]> 
> From: Frank Smith [mailto:[email protected]]=20 
> From: "Smith, Frank" [mailto:[email protected]]=20 

,所以我需要太格式化字符串,这样我结束了3个变量,名字,姓氏和电子邮件。

有没有更好的方法来解析文件来获取电子邮件地址和名称? 我如何处理字符串并重新排列它们,通常需要用逗号来换名称。

任何人都可以帮忙吗?

这是迄今为止我的脚本...

#!/usr/bin/perl 

@files = </storage/filters/*>; 
foreach $file (@files) 
{ 
     open (FILE, "$file"); 
     while($line= <FILE>) 
     { 
      print $line if $line =~ /. From:/; 
     } 
     close FILE; 
} 
+0

你看过CPAN吗?电子邮件::地址可能主要适合账单。至于名称的交换,这是微不足道的(交换)和艰难的(以确定是否需要交换 - 我不认为只有逗号可能是足够的)。另外,使用glob而不是'<...>' - 更具可读性。 – Tanktalus 2011-04-19 19:30:58

+0

@Tanktalus电子邮件::地址是伟大的,但它不会处理乱码,如“'来自:”史密斯,弗兰克“[mailto:[email protected]] = 20';' – cnicutar 2011-04-19 19:32:56

回答

6

如果你确定那些是唯一有效的格式,写脚本来处理只是那些,并丢弃其余部分。

my $first, $last, $email; 
while($line = <FILE>) { 
    if($line =~ /From:\s+"(.*?),\s*(.*?)"\s+<(.*?)>/) { 
     ($first, $last, $email) = ($2, $1, $3); 
    } elsif($line =~ /From:\s+"(.*?)\s+(.*?)\s+<(.*?)>/) { 
     ($first, $last, $email) = ($1, $2, $3); 
    } elsif($line =~ /From:\s+"(.*?),\s*(.*?)"\s+\[mailto:(.*?)\]/) { 
     ($first, $last, $email) = ($2, $1, $3); 
    } elsif($line =~ /From:\s+"(.*?)\s+(.*?)\s+\[mailto:(.*?)\]/) { 
     ($first, $last, $email) = ($1, $2, $3); 
    } 
    # Do something with $first, $last and $email. . . . 
} 

完全跳过坏的情况。你当然可以收紧代码:

my $first, $last, $email; 
while($line = <FILE>) { 
    if($line =~ /From:\s+"(.*?),\s*(.*?)"\s+(?:<|\[mailto:)(.*?)(?:>|\])/) { 
     ($first, $last, $email) = ($2, $1, $3); 
    } elsif($line =~ /From:\s+"(.*?)\s+(.*?)\s+(?:<|\[mailto:)(.*?)(?:>|\])/) { 
     ($first, $last, $email) = ($1, $2, $3); 
    } 
    # Do something with $first, $last and $email. . . . 
} 

或其他可能性。

现在,如果您想确保电子邮件地址的格式是有效的,那么这是一个不同的处理。这也会被诸如“Martin van Buren”之类的名字所击败。

+0

好像愚蠢作为这听起来我没有想到...谢谢:) – ard 2011-04-20 14:49:24

+0

适合我们所有人,ard。 :) – mcglk 2011-04-21 01:03:06

相关问题