hckyu_13 2022-09-23 01:56 采纳率: 0%
浏览 7

关于两个文档内数据的比较问题

问题是这样的
我有两个文档,大概两个里面各有50w多条数据,

我现在需要从a文档里面取出一条,去到b文档对比看有没有重复,如果没有,又重新去a文档取第二行到b文档来对比。如果有重复的就把重复的拿出来放到另外个新建文档保存起来 。。。。就这样,直到查完a文档的全部数据

重点来了,

请问我该怎么快速操作,才能快速搞定这50w条数据??

  • 写回答

1条回答 默认 最新

  • 赵4老师 2022-09-23 09:46
    关注

    仅供参考:

    //输出PROG中有但LIST中没有的文本行,即集合PROG-LIST
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include <search.h>
    #define MAXCHARS 512
    int MAXLINES=10000,MAXLINES2;
    char *buf,*buf2;
    char PROG[256]="PROG";//程序Program需要的文件列表
    char LIST[256]="LIST";//dir /b /s生成的实际文件列表List
    FILE *fp,*fl;
    int i,c,n,L,hh;
    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);
    }
    int main(int argc,char **argv) {
        if (argc>1) strcpy(PROG,argv[1]);//命令行参数1覆盖PROG
        if (argc>2) strcpy(LIST,argv[2]);//命令行参数2覆盖LIST
        if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
        if ((fl=fopen(LIST,"rt"))==NULL) {
            fprintf(stderr,"Can not open %s\n",LIST);
            fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
            return 1;
        }
        if ((fp=fopen(PROG,"rt"))==NULL) {
            fclose(fl);
            fprintf(stderr,"Can not open %s\n",PROG);
            fprintf(stderr,"Usage: %s [PROG] [LIST] [-i]\n",argv[0]);
            return 2;
        }
        buf=(char *)malloc(MAXLINES*MAXCHARS);
        if (NULL==buf) {
            fclose(fl);
            fclose(fp);
            fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
            return 4;
        }
        n=0;
        hh=0;
        i=0;
        while (1) {
            if (fgets(ln,MAXCHARS,fl)==NULL) break;//
            hh++;
            L=strlen(ln)-1;
            if ('\n'!=ln[L]) {//超长行忽略后面内容
                fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",LIST,hh,MAXCHARS);
                while (1) {
                    c=fgetc(fl);
                    if ('\n'==c || EOF==c) break;//
                }
            }
            while (1) {//去掉行尾的'\n'和空格
                if ('\n'==ln[L] || ' '==ln[L]) {
                    ln[L]=0;
                    L--;
                    if (L<0) break;//
                } else break;//
            }
            if (L>=0) {
                strcpy(buf+i,ln);i+=MAXCHARS;
                n++;
                if (n>=MAXLINES) {
                    MAXLINES2=MAXLINES*2;
                    if (MAXLINES2==1280000) MAXLINES2=2500000;
                    buf2=(char *)realloc(buf,MAXLINES2*MAXCHARS);
                    if (NULL==buf2) {
                        free(buf);
                        fclose(fl);
                        fclose(fp);
                        fprintf(stderr,"Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                        return 5;
                    }
                    buf=buf2;
                    MAXLINES=MAXLINES2;
                }
            }
        }
        fclose(fl);
        if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
        else qsort(buf,n,MAXCHARS,compare);
        hh=0;
        while (1) {
            if (fgets(ln,MAXCHARS,fp)==NULL) break;//
            hh++;
            L=strlen(ln)-1;
            if ('\n'!=ln[L]) {//超长行忽略后面内容
                fprintf(stderr,"%s Line %d too long(>%d),spilth ignored.\n",PROG,hh,MAXCHARS);
                while (1) {
                    c=fgetc(fp);
                    if ('\n'==c || EOF==c) break;//
                }
            }
            while (1) {//去掉行尾的'\n'和空格
                if ('\n'==ln[L] || ' '==ln[L]) {
                    ln[L]=0;
                    L--;
                    if (L<0) break;//
                } else break;//
            }
            if (L>=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);
        free(buf);
        return 0;
    }
    
    
    
    评论

报告相同问题?

问题事件

  • 创建了问题 9月23日

悬赏问题

  • ¥30 vmware exsi重置后登不上
  • ¥15 易盾点选的cb参数怎么解啊
  • ¥15 MATLAB运行显示错误,如何解决?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容
  • ¥15 关于#stm32#的问题:CANOpen的PDO同步传输问题
  • ¥20 yolov5自定义Prune报错,如何解决?
  • ¥15 电磁场的matlab仿真
  • ¥15 mars2d在vue3中的引入问题
  • ¥50 h5唤醒支付宝并跳转至向小荷包转账界面