2016-02-25 67 views
0

我有一個txt文件,其中包含大量的電子郵件,並且它們沒有空格分隔。我希望逐行整理這些電子郵件。如何分割未分隔的電子郵件地址?

所以,我的問題是:如何獲得只分離這些電子郵件的部分?

例:(foo.txt的)

brarabelalima @ hotmail.comaracaesporteclube @ terra.com.br

我想是這樣的:(new.txt)

[email protected]

[email protected]

這是我最後一次嘗試:通過文字

{$APPTYPE CONSOLE} 

{$R *.res} 

uses 
    SysUtils, 
    Windows, 
    Classes; 

procedure arrumarEmailsTXT; 
var 
Linhas, Colunas:TStringList; 
i,j:integer; 
arq: TextFile; 
begin 
Linhas := TStringList.Create; 
Colunas := TStringList.Create; 
AssignFile(arq, 'new.txt'); 
Rewrite(arq); 
try 
    Linhas.LoadFromFile('foo.txt'); 
    for i := 0 to Pred(Linhas.Count) do 
    begin 
    Colunas.text := StringReplace(Linhas.Strings[i],'',#13,[rfReplaceAll]); 
    for j := 0 to Pred(Colunas.Count) do 
    begin 
     Writeln(arq, Colunas.Strings[j]); 
    end; 
    end; 
finally 
    CloseFile(arq); 
    Linhas.Free; 
    Colunas.Free; 
end; 
end; 

begin 
    arrumarEmailsTXT; 
end. 
+3

你需要找到一套規則,以確定一個地址結束和另一個開始。 –

+2

沒有足夠的信息。他們都是.com地址嗎?他們都是簡單的TLD嗎? '@'後面有多個時段,比如'fred.smith @ somewhere.mysite.com'?那麼名稱部分中的任何特殊字符怎麼樣,比如'&'或'('?更具體一些,並且定義了你想用來定義電子郵件地址開始和結束的確切規則。因爲你試圖用一個回車代替空的空格(''''),並且你的文本文件中不可能有任何空的空格。定義你的電子郵件地址規則。 –

+2

另外,我''已經刪除了'delimited'標籤,因爲如果文件被分隔了就不會有問題了,但根據你自己的話和例子沒有分隔符。 –

回答

-3

SOLUTION:

{$APPTYPE CONSOLE} 

    {$R *.res} 

    uses 
     Winapi.Windows, 
     Classes, 
     System.SysUtils; 

    function ExtractEmails(const Input: String; out Emails: TStringList): Boolean; 
    var 
     I : Integer; 
     Buffer : String; 
     Tokens : TStringList; 
    begin 
     Result := False; 
     Tokens := TStringList.Create; 
     Emails := TStringList.Create; 
     Try 
     Tokens.Delimiter := #32; 
     Tokens.DelimitedText := Input; 
     For I := 0 To Tokens.Count - 1 Do 
      begin 
      Buffer := Tokens.Strings[I]; 
      If Length(Buffer) < 5 Then Continue; 
      If (Pos('@',Buffer) > 1) And 
      (Pos('.',Buffer) > 3) And 
      (Pos('.',Buffer) < Length(Buffer)) Then 
      begin 
      Emails.Add(Buffer); 
      end; 
     end; 
     Result := True; 
     Finally 
     Tokens.Free; 
     end; 
    end; 

    procedure Extrai; 
    var 
    Linhas,Emails:TStringList; 
    arq: TextFile; 
    begin 
    Linhas := TStringList.Create; 
    Emails := TStringList.Create; 
    try 
     Linhas.LoadFromFile('foo.txt'); 
     AssignFile(arq, 'emails.txt'); 
     Rewrite(arq); 
      If ExtractEmails(Linhas.Text,Emails) Then 
      begin 
      Writeln(arq,Emails.Text); 
      end; 
    finally 
     CloseFile(arq); 
     Linhas.Free; 
     Emails.Free; 
    end; 
    end; 

    begin 
     Extrai; 
    end. 
+0

沒有解釋的代碼? –

+1

如果您在'ExtractEmails'中使用TStringLists,爲什麼在地球上您使用AssignFile,Rewrite等來保存輸出? – MartynA

+0

@MartynA,將輸出保存在新的txt文件中。 –

-3

首先運行,並創建一個@的零件清單 - @

然後,取新列表中的每個條目,並從開始到第一個時段刪除文本。這會給你一個這些電子郵件擁有的域名列表。

然後,你需要填寫域的最後部分,並創建一個新的名單基地,你的經驗。 例如,對於每個'hotmail',你將有'hotmail.com'和'hotmail.co.uk'等。

之後,你可以根據完整的域名爲每一行提取正確的位置。

然而,這可能會變得非常繁重,需要很多時間和資源。你的文件很大嗎?您可能需要線程纔能有效運行作業。

此外,知道電子郵件的來源可以幫助您減少域名。

+0

那個完全有效的地址'fred.smith @ somewhere.mysite.com'怎麼樣?那些只有兩個字母的域如'.ru'或'.sp' ?那些包含特殊字符如'&'或'('?)的完美合法地址怎麼辦? –

+0

@Ken他們呢?這是他的問題---他不知道域名(或用戶名)。在他沒有預定義規則的那一刻,你要求他定義規則。 –

+0

不,這是你不完整的答案沒有解決的問題,這是非常真實的可能性。相反,你會在一些非常繁重的工作*和*線索*上廢話。您應該等待澄清要求,而不是將問題的答案發布到不完整的問題。發佈不完整或不完整的答案並不比發佈錯誤的答案好。 *從開始到第一個階段剪切文本*不**給你一個域名列表(正如我的'fred.smith'示例所示)。 –

相關問題