如何拆分非分隔的电子邮件地址?

时间:2016-02-25 23:39:46

标签: delphi

我有一个包含大量电子邮件的txt文件,并且它们没有空格分隔。我想逐行整理这些电子邮件。

所以,我的问题是:如何只获取分隔这些电子邮件的部分?

Ex:(foo.txt)

brarabelalima @ hotmail.comaracaesporteclube @ terra.com.br

我想这样:(new.txt)

brarabelalima@hotmail.com

aracaesporteclube@terra.com.br

这是我的最后一次尝试:

{$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.

2 个答案:

答案 0 :(得分:-3)

首先浏览文本并创建一个包含@ - @

之间部分的列表

然后,记下新列表的每个条目,并从开头到第一个句点剪切文本。这将为您提供这些电子邮件所包含的域名列表。

然后,您需要填写域的最后一部分,并根据您的经验创建一个新的列表库。 例如,对于每个' hotmail'你会有' hotmail.com'和' hotmail.co.uk'等

之后,您可以根据完整的域名提取每行的正确位置。

然而,这可能会变得非常繁重,需要很多时间和资源。你的档案很大吗?您可能需要线程才能有效地运行作业。

此外,了解电子邮件的来源可能会帮助您减少域名。

答案 1 :(得分:-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.