2011-04-19 125 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