快速排序?

Treenewbee 2014-07-14 02:20:41
一个超过300M的12列的CSV文件,包含大约2000万 条记录,如何取出前1000万行并按第2列进行排序,保存到新的CSV文件?
...全文
356 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
舉杯邀明月 2014-07-25
  • 打赏
  • 举报
回复
引用 8 楼 nanfei01055 的回复:
一句一句处理吧,建议插入到sql中,排序完成现存成csv,没vb啥事儿了 如果用vb,那就考验你的算法和编程经验了,当然也不难哦,只是执行时间可能会长一点
凭啥说“用VB”来处理,就会比你那啥的SQL慢了??? 不过话又说回来,VB6似乎“门槛”比较低, 造成了不少没编程水平的人,偏偏会几句VB代码, 最终搞得垃圾代码满天飞……
nanfei01055 2014-07-25
  • 打赏
  • 举报
回复
一句一句处理吧,建议插入到sql中,排序完成现存成csv,没vb啥事儿了 如果用vb,那就考验你的算法和编程经验了,当然也不难哦,只是执行时间可能会长一点
赵4老师 2014-07-24
  • 打赏
  • 举报
回复
仅供参考,尽管是C:
//文件1中的内容排序并去重,结果保存到文件2中
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAXCHARS 128      //能处理的最大行宽,包括行尾的\n和字符串尾的\0
int MAXLINES=10000,MAXLINES2;
char *buf,*buf2;
int c,n,hh,i,L;
FILE *f;
char ln[MAXCHARS];
int ignore_case=0;
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<3) {
        printf("Unique line. Designed by zhao4zhong1@163.com. 2012-08-20\n");
        printf("Usage: %s src.txt uniqued.txt [-i]\n",argv[0]);
        return 1;
    }
    if (argc>3) ignore_case=1;//若存在命令行参数3,忽略大小写
    f=fopen(argv[1],"r");
    if (NULL==f) {
        printf("Can not find file %s!\n",argv[1]);
        return 1;
    }
    buf=(char *)malloc(MAXLINES*MAXCHARS);
    if (NULL==buf) {
        fclose(f);
        printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES,MAXCHARS);
        return 2;
    }
    n=0;
    hh=0;
    i=0;
    while (1) {
        if (NULL==fgets(ln,MAXCHARS,f)) break;//
        hh++;
        L=strlen(ln)-1;
        if ('\n'!=ln[L]) {//超长行忽略后面内容
            printf("%s Line %d too long(>%d),spilth ignored.\n",argv[1],hh,MAXCHARS);
            while (1) {
                c=fgetc(f);
                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) {
                    printf("Can not malloc(%d LINES*%d CHARS)!\n",MAXLINES2,MAXCHARS);
                    printf("WARNING: Lines >%d ignored.\n",MAXLINES);
                    break;//
                }
                buf=buf2;
                MAXLINES=MAXLINES2;
            }
        }
    }
    fclose(f);
    if (n>1) {
        if (ignore_case) qsort(buf,n,MAXCHARS,icompare);
        else qsort(buf,n,MAXCHARS,compare);
    }
    f=fopen(argv[2],"w");
    if (NULL==f) {
        free(buf);
        printf("Can not create file %s!\n",argv[2]);
        return 2;
    }
    fprintf(f,"%s\n",buf);
    if (n>1) {
        if (ignore_case) {
            hh=0;
            L=MAXCHARS;
            for (i=1;i<n;i++) {
                if (stricmp((const char *)buf+hh,(const char *)buf+L)) {
                    fprintf(f,"%s\n",buf+L);
                }
                hh=L;
                L+=MAXCHARS;
            }
        } else {
            hh=0;
            L=MAXCHARS;
            for (i=1;i<n;i++) {
                if ( strcmp((const char *)buf+hh,(const char *)buf+L)) {
                    fprintf(f,"%s\n",buf+L);
                }
                hh=L;
                L+=MAXCHARS;
            }
        }
    }
    fclose(f);
    free(buf);
    return 0;
}
bcrun 2014-07-24
  • 打赏
  • 举报
回复
还好你这大文件还只超过300M,在现在连平价手机内存都有1G的时代,一次性读入内存再排序都没啥问题。这就没啥好讨论的了,照数据结构和基础算法中排序的基本思路做就是了。
startbin 2014-07-24
  • 打赏
  • 举报
回复
利用ado直接把这个csv当作数据源 调用查询语句排序就行了~~
平头哥哥 2014-07-24
  • 打赏
  • 举报
回复
Treenewbee 2014-07-23
  • 打赏
  • 举报
回复
引用 1 楼 caozhy 的回复:
用excel,如果你不会写程序的话。当然你有钱雇佣程序员为你开发另当别论。
excel只能处理100万行,慢的要死
  • 打赏
  • 举报
回复
大文件读取本身就是一件不容易的事,大数据排序也挑战你的能力
threenewbee 2014-07-14
  • 打赏
  • 举报
回复
用excel,如果你不会写程序的话。当然你有钱雇佣程序员为你开发另当别论。

7,763

社区成员

发帖
与我相关
我的任务
社区描述
VB 基础类
社区管理员
  • VB基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧