首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

字符串提取匹配

2012-07-28 
求助字符串提取匹配求助各路高手有一个任务是从某一个数据库中的某一个表项:LOCAL ADRESS中分割提取地址比

求助字符串提取匹配
求助各路高手
有一个任务是从某一个数据库中的某一个表项:LOCAL ADRESS中分割提取地址
比如:
高林一里21-2002-
沧虹东里1#803-
维多利亚1#803
沧湖东一里248#102-
滨湖东路582#301(空挂)-

从中提取不同等级的地址,提取之后的结果应该是
高林一里 21# 2002
沧虹东里 1# 803-
沧湖东一里 248# 102-
滨湖东路 582号 #301(空挂)-

由于需要操作的数目太多大概有4W条,所以需要一个算法,而且地址的种类远不止上面我说道的这些
能不能请各位给个好点的建议或者算法的推荐?

[解决办法]

C/C++ code
//i.txt://高林一里21-2002-//沧虹东里1#803-//维多利亚1#803//沧湖东一里248#102-//滨湖东路582#301(空挂)-#include <stdio.h>FILE *fi,*fo;char fni[260]="i.txt";char fno[260]="o.txt";char ln[1000];char s1[100];char s2[100];char s3[100];char s4[100];char s5[100];int n;int main() {    fi=fopen(fni,"r");    if (NULL==fi) {        fprintf(stderr,"Can not open file %s!\n",fni);        return 1;    }    fo=fopen(fno,"w");    if (NULL==fo) {        fclose(fi);        fprintf(stderr,"Can not create file %s!\n",fno);        return 2;    }    n=0;    while (1) {        if (NULL==fgets(ln,1000,fi)) break;        n++;        if (5==sscanf(ln,"%99[^0-9]%99[0-9]%99[^0-9]%99[0-9]%99[^\n]",s1,s2,s3,s4,s5)) {            fprintf(fo,"%s %s%s %s%s\n",s1,s2,s3,s4,s5);        } else {            fprintf(stderr,"Line %d format error:%s",n,ln);        }    }    fclose(fo);    fclose(fi);    return 0;}//Line 3 format error:维多利亚1#803////o.txt//高林一里 21- 2002-//沧虹东里 1# 803-//沧湖东一里 248# 102-//滨湖东路 582# 301(空挂)-
[解决办法]
如果不确定有多少种地址形式的话,我建议是用有人干预的匹配方式,具体思路是:
1.建立匹配用的正则表达式库
2.按行匹配
3.如果遇上不匹配的行,则要求用户输入正则表达式,并添加入库中,继续匹配
如此循环,直到处理完所有文件。

如果确定了地址的形式,那么建议用flex来做这个事情,效率会比较高。
如果你的运行环境是多核的话,可以分两次匹配:第一次分行,然后把各行分配到不同的CPU线程上,进行各自的匹配,最后再归并匹配结果。

热点排行