寻找文本文件中特征字符串查找的程序思路?(50分)

  • 主题发起人 主题发起人 vivee
  • 开始时间 开始时间
V

vivee

Unregistered / Unconfirmed
GUEST, unregistred user!
我要从一个文本文件中查找符合预定规则的特征字符,比如电子邮件地址,
如果存在的话,把它取出来放到另外一个文件中,我该怎么办?
比如
文本文件内容为:
EHLO ms-exchange.luenthai.com
MAIL FROM:<stang@luenthai.com> SIZE=3065
RCPT TO:<ctsipni@mail.fm>
我要找到其中的所有电子邮件地址:并把这些电子邮件地址存放到另外一个文本中!编程思路是?
假如还要加上另外的要求,我的文本文件中还要包括关键词数据库中的一个和多个数据,编程思路又如何?

是不是很复杂,我的分数有限,只能给50分,对不起各位了!!
 
怎么没有高手吗?还是嫌分数太少?!!
 
一个建议:
将文本数据分解为一些词组,以某些字母作为词组的分隔,
如:<>@. 空格,回车 等各种符号
如果相邻的词组符合一定的规则,则认为是合法的,并进行收集
规则的定义为 词组1@词组2.词组3.词组4
然后仿照字符串的匹配方法来进行词组的匹配,
可以获得较高的处理速度和实现复杂的控制规则
 
我怎么分解呢?能否举个例子如何查找?
 
可以参照html文档的语法分析方法,
使用循环遍历所有的字符,可以将GBK汉字作为一个字符,
当遇到分隔字符时,表示前面的那个词已经结束,后面的词即将开始
 
给你分解STRING的源程序,

Procedure SubfromStr(Const Str_T:String;Delimiter:Char;Var Str0,Str1:String);
Var Str:String;
Str_Pos1,Str_Pos2:Integer;
Str_Start,Str_num,Str_pos:Integer;
begin
str:=trim(Str_t);
Str_pos:=Pos(Delimiter,Str);
if(Str_Pos=0)then
begin
Str0:=Str;
Str1:='';
end Else
begin
Str_Start:=1;
Str_Num:=Str_Pos-1;
Str0:=copy(str,Str_Start,Str_Num);
Str_Start:=Str_Num+2;
Str1:=Copy(Str,Str_Start,length(Str));
end;
end;
 
百分之百可用,用来割字符串很好用的
 
简单方法
1.将文本文件内容赋给一字符串变量如:str
2.在str中查找@
3.从@开始往前查找字符,直到找到第一个电子邮件地址的非法字符,如<>:等,
这样就找了邮件地址的头的位置。
4.用同3的办法找到邮件地址的尾的位置
5.知道了头尾的位置,一个邮件地址就找出来了。

相同方法找到其它邮件地址。
 
现在邮件地址已经成功取到,
下一步是我如何知道文本文件包括多少个关键字,
其中关键字是一个存在的数据库表中的字段值(比较多!),
我要根据它判断该文本文件的重要程度!
请大家帮帮我!!
 
难道就没有人再出手吗?!
帮人帮到底吧:)
 
我也想知道有没有高效的算法,我也有类似的问题有待解决
 
高手快来!!!!!!
 
const
CRLF = #13#10;
EMailCondition = ['@', '.'];
SMsg =
'EHLO ms-exchange.luenthai.com' + CRLF +
'MAIL FROM:<stang@luenthai.com> SIZE=3065' + CRLF +
'RCPT TO:<ctsipni@mail.fm>';

type
TChars = set of Char;

function GetEMail(const S: string;
Condition: TChars = EMailCondition;
Separator1: Char = '<';
Separator2: Char = '>'): string;

function GetCondition: string;
var
I: Char;
P: PChar;
begin
SetLength(Result, 255);
P := PChar(Result);
for I := #0 to #255 do
if I in Condition then
begin
P^ := I;
Inc(P);
end;
SetLength(Result, StrLen(PChar(Result)));
end;

var
P: PChar;
I, Len: Integer;
List: TStringList;
S1, S2, Have: Boolean;
Mail, SCondition: string;
begin
Len := Length(S);
P := PChar(S);
S1 := False;
Mail := '';

SCondition := GetCondition;
List := TStringList.Create;
try
while Len > 0 do
begin
if not S1 then
begin
S1 := P^ = Separator1;
Inc(P);
Dec(Len);
Continue;
end;
S2 := P^ = Separator2;
if S2 and S1 then
begin
Have := False;
for I := 1 to Length(SCondition) do
begin
Have := Pos(SCondition, Mail) > 0;
if not Have then break;
end;
if Have then
List.Add(Mail);
Mail := '';
S1 := False;
Continue;
end;
if S1 and not S2 then
Mail := Mail + P^;
Inc(P);
Dec(Len);
end;
Result := List.Text;
finally
List.Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
ShowMessage(GetEMail(SMsg));
end;
 
copypaste:
谢谢你的回复!!
现在我要的回答是

我如何知道文本文件包括多少个关键字,
其中关键字是一个存在的数据库表中的字段值(比较多!),
我要根据它判断该文本文件的重要程度!
可以办到吗?!!

 
那你的问题跟这个差不多,他求的是效率,你看看吧。
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1511381
 
是啊,如果不考虑效率,那倒是很简单啊,
人家可是拿了300分来讨论问题,都没有理想的答案
 
用循环直接对比能行,可是有点慢呀
 
用老外写的快速POS函数,用它POS关键字,快得一塌糊涂
 
iseek:
老外写的快速pos函数在哪里,能否发上来给俺看看!!
另外,怎么有的文本,我用记事本看到的内容跟load到richedit控件中的不一样?!
richedit中会少掉后面的一段!!真是奇怪,你们遇到过吗?!
 
后退
顶部