2011-04-19 3 views
2

이메일로 가득 찬 디렉토리를 구문 분석하고 이메일 주소와 해당 이름을 추출하는 펄 스크립트를 작성하려합니다.이메일 주소와 이름을 추출하십시오.

지금은 "보낸 사람 :"이라는 단어를 파싱 한 다음 줄을 추출하지만이 부분은 내가 붙어있는 곳입니다.

데이터는 다음과 같은 형식 일 수 있습니다

> 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

+0

@Tanktalus'Email :: Address'는 훌륭하지만 "From :"Smith, Frank "[mailto : [email protected]] = 20 ';' – cnicutar

답변

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

+0

우리 모두에게 일어난 일. :) – mcglk

관련 문제