问高手们一个问题吧,关于字符串处理的

zhaolinger2 2010-10-26 10:30:48
现在手里有个系统,可以通过输入类似xml的字符串实现某些功能。
比如下面这个字符串(CString):

<INPUT><FILES><FILE><FILEPATH>C:/1.txt</FILEPATH><TIMEOUT>300</TIMEOUT></FILE><FILE><FILEPATH>C:/2.txt</FILEPATH><TIMEOUT>500</TIMEOUT></FILE></FILES><FILES>...</FILES></INPUT>

输入系统后,系统会解析这个字符串,提取出各项参数,然后做出对应的响应。
比如上面这个,就会从指定路径的文件中分别读入数据,如果读取时间超过设定值,则停止读入并报错。

现在客户有一个上百万字符长度的上面这种格式的字符串,系统中有个功能是提取出所有的位于同一个<FILES></FILES>中的<FILEPATH></FILEPATH>中的文件路径,将它们按顺序拼接成一个新字符串,中间用逗号分隔,有几个<FILES></FILES>就生成几个新字符串。我发现如果频繁使用CString自带的Find和Mid方法,处理会很慢,大概需要一分钟才能处理完。不知道有没有高手能够优化这个处理逻辑?

不胜感谢!100分送上!
...全文
169 点赞 收藏 10
写回复
10 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
ocean1004 2010-10-27
词法分析器?没看懂。留个名。。。
回复
modyaj 2010-10-26
[Quote=引用 3 楼 ouyh12345 的回复:]
CString处理大量的字符确实很费劲
用char *或者std::string
[/Quote]
++1
回复
qq120848369 2010-10-26
可以写个状态机,应该连嵌套<FILES> <FILES> <FILEPATH></FILEPATH> </FILES> </FILES>
这样复杂的情况也可以,我不懂XML.

就和写个词法分析器一样.从初态S开始,根据识别的字符进入不同的状态,如果是终态就找到一个关键字.

主要就是hash_table<(当前状态,字符),下一个状态>,实现时候每个状态对应一个函数就可以.
回复
ouyh12345 2010-10-26
CString处理大量的字符确实很费劲
用char *或者std::string
回复
zhaolinger2 2010-10-26
最好是使用字符串来处理,尽量不要使用XML来解析。如果最后实在没有办法,用XML解析也是一种方案。

[Quote=引用 1 楼 hslinux 的回复:]
数据头加多一行XML标志,直接作为XML数据解析是否可行?
[/Quote]
回复
hslinux 2010-10-26
数据头加多一行XML标志,直接作为XML数据解析是否可行?
回复
gules 2010-10-26
用栈检查平衡符号一样的算法,来进行处理即可。
回复
赵4老师 2010-10-26
《编译原理》词法分析 有限状态自动机
回复
harderman 2010-10-26
LS强大.
回复
selooloo 2010-10-26
我写的一个,扫描一遍即可提取所需信息

#include <stdio.h>
#include <string.h>

void extract(char *str)
{
char *s=str;
char word[64]={0},wbuf[8][32]={0};//wbuf存储路径字符串
int i=0,begin=0,sbegin=0,wcount=-1;
while(*s!='\0')
{
if(*s=='>')
{
word[i++]=*s++;
word[i]=0;
i=0;
if(strcmp(word,"<FILES>")==0)
{
wcount++;
}
if(strcmp(word,"<FILEPATH>")==0)
{
begin++;
}
}
else if(*s=='<' && i>0)
{
word[i]=0;
if(begin)
{
strcat(wbuf[wcount],word);
strcat(wbuf[wcount],",");
begin--;
}
i=0;
}
word[i++]=*s++;
}
for(i=0;i<=wcount;++i)
{
puts(wbuf[i]);
}
}
int main(void)
{
char *buf="<INPUT><FILES><FILE><FILEPATH>C:/1.txt</FILEPATH>"
"<TIMEOUT>300</TIMEOUT></FILE><FILE><FILEPATH>C:/2.txt"
"</FILEPATH><TIMEOUT>500</TIMEOUT></FILE></FILES>"
"<FILES><FILE><FILEPATH>C:/3.txt</FILEPATH>"
"<TIMEOUT>300</TIMEOUT></FILE><FILE><FILEPATH>C:/4.txt"
"</FILEPATH><TIMEOUT>500</TIMEOUT></FILE></FILES>";

extract(buf);
getchar();
return 0;
}

回复
相关推荐
发帖
C++ 语言
创建于2007-09-28

6.0w+

社区成员

C++ 语言相关问题讨论,技术干货分享,前沿动态等
申请成为版主
帖子事件
创建了帖子
2010-10-26 10:30
社区公告
暂无公告