晕,你这问题怎么还没有解决呢? 用sql语句很快就搞定了呀。如:create table t1 (a int ) insert into t1 select 1 union select 2 union select 3 create table t2 (a int ) insert into t2 select 3 union select 4 union select 5 go select * from t1 except select * from t2
个人感觉 SQL是最好的选择 毕竟是十几万的行呢
特在此奉献出对应的C++源代码 //输出PROG中有但LIST中没有的文本行,即集合PROG-LIST #include <stdio.h> #include <string.h> #include <stdlib.h> #include <search.h> #define MAXLINES 1000000 #define MAXCHARS 256 char buf[MAXLINES][MAXCHARS]; char P[256]="PROG";//程序Program需要的文件列表 char L[256]="LIST";//dir /b /s生成的实际文件列表List FILE *fp,*fl; int n,L1; int ignore_case=0; char ln[MAXCHARS]; int icompare(const void *arg1,const void *arg2) { return stricmp((char *)arg1,(char *)arg2); } int compare(const void *arg1,const void *arg2) { return strcmp((char *)arg1,(char *)arg2); } void main(int argc,char **argv) { if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写 if ((fl=fopen(L,"rt"))==NULL) { printf("Can not open %s\n",L); return; } if ((fp=fopen(P,"rt"))==NULL) { fclose(fl); printf("Can not open %s\n",P); return; } n=0; while (1) { if (fgets(ln,MAXCHARS,fl)==NULL) break;// L1=strlen(ln)-1; while (1) { if ('\n'==ln[L1]||' '==ln[L1]) { ln[L1]=0; L1--; } else break;// } if (L1>=0) { strcpy(buf[n],ln); n++; if (n>=MAXLINES) { fclose(fl); fclose(fp); printf("%s up to %d lines",L,MAXLINES); return; } } } fclose(fl); if (ignore_case) qsort(buf,n,MAXCHARS,icompare); else qsort(buf,n,MAXCHARS,compare); while (1) { if (fgets(ln,MAXCHARS,fp)==NULL) break;// L1=strlen(ln)-1; while (1) { if ('\n'==ln[L1]||' '==ln[L1]) { ln[L1]=0; L1--; } else break;// } if (L1>=0) { if (ignore_case) { if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln); } else { if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln); } } } fclose(fp); }
++1
这个软件比较专业了,
再给你说一个UltraEdit32,不过这个可能在处理几十万条的txt上可能会很慢.
列举:
文本1行数据(1,2,3,4,5)
文本2行数据(4,5,6,7,8)
只要文本2中行数据(6,7,8)
如果文本1、文本2中有几十万行数据 有没有什么好的办法提取出来
001 346,186 -> 0122 11,41
001 347,186 -> 0122 12,42
001 348,187 -> 0122 13,43
0122 11,42 -> 001 346,187
0122 12,43 -> 001 348,188
0122 13,44 -> 001 347,187
要求能把前面编号读取,两个坐标读取,以及连接的后面的编号,坐标读出来
而且要求效率 应为想这样的文本还有很长很长,估计在6W行左右
http://download.csdn.net/source/922068
用sql语句很快就搞定了呀。如:create table t1 (a int )
insert into t1 select 1 union select 2 union select 3
create table t2 (a int )
insert into t2 select 3 union select 4 union select 5
go
select * from t1 except select * from t2
//输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <search.h>
#define MAXLINES 1000000
#define MAXCHARS 256
char buf[MAXLINES][MAXCHARS];
char P[256]="PROG";//程序Program需要的文件列表
char L[256]="LIST";//dir /b /s生成的实际文件列表List
FILE *fp,*fl;
int n,L1;
int ignore_case=0;
char ln[MAXCHARS];
int icompare(const void *arg1,const void *arg2) {
return stricmp((char *)arg1,(char *)arg2);
}
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
void main(int argc,char **argv) {
if (argc>1) strcpy(P,argv[1]);//命令行参数1覆盖PROG
if (argc>2) strcpy(L,argv[2]);//命令行参数2覆盖LIST
if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
if ((fl=fopen(L,"rt"))==NULL) {
printf("Can not open %s\n",L);
return;
}
if ((fp=fopen(P,"rt"))==NULL) {
fclose(fl);
printf("Can not open %s\n",P);
return;
}
n=0;
while (1) {
if (fgets(ln,MAXCHARS,fl)==NULL) break;//
L1=strlen(ln)-1;
while (1) {
if ('\n'==ln[L1]||' '==ln[L1]) {
ln[L1]=0;
L1--;
} else break;//
}
if (L1>=0) {
strcpy(buf[n],ln);
n++;
if (n>=MAXLINES) {
fclose(fl);
fclose(fp);
printf("%s up to %d lines",L,MAXLINES);
return;
}
}
}
fclose(fl);
if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
else qsort(buf,n,MAXCHARS,compare);
while (1) {
if (fgets(ln,MAXCHARS,fp)==NULL) break;//
L1=strlen(ln)-1;
while (1) {
if ('\n'==ln[L1]||' '==ln[L1]) {
ln[L1]=0;
L1--;
} else break;//
}
if (L1>=0) {
if (ignore_case) {
if (NULL==bsearch(ln,buf,n,MAXCHARS,icompare)) printf("%s\n",ln);
} else {
if (NULL==bsearch(ln,buf,n,MAXCHARS,compare)) printf("%s\n",ln);
}
}
}
fclose(fp);
}