一個超過300M的12列的CSV檔案,包含大約2000萬 條記錄,如何取出前1000萬行并按第2列進行排序,保存到新的CSV檔案?
uj5u.com熱心網友回復:
用excel,如果你不會寫程式的話。當然你有錢雇傭程式員為你開發另當別論。uj5u.com熱心網友回復:
大檔案讀取本身就是一件不容易的事,大資料排序也挑戰你的能力uj5u.com熱心網友回復:
excel只能處理100萬行,慢的要死
uj5u.com熱心網友回復:
還好你這大檔案還只超過300M,在現在連平價手機記憶體都有1G的時代,一次性讀入記憶體再排序都沒啥問題。這就沒啥好討論的了,照資料結構和基礎演算法中排序的基本思路做就是了。uj5u.com熱心網友回復:
僅供參考,盡管是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 [email protected]. 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;
}
uj5u.com熱心網友回復:
http://bbs.csdn.net/topics/340173969uj5u.com熱心網友回復:
利用ado直接把這個csv當作資料源 呼叫查詢陳述句排序就行了~~uj5u.com熱心網友回復:
一句一句處理吧,建議插入到sql中,排序完成現存成csv,沒vb啥事兒了如果用vb,那就考驗你的演算法和編程經驗了,當然也不難哦,只是執行時間可能會長一點
uj5u.com熱心網友回復:
憑啥說“用VB”來處理,就會比你那啥的SQL慢了???

不過話又說回來,VB6似乎“門檻”比較低,
造成了不少沒編程水平的人,偏偏會幾句VB代碼,
最終搞得垃圾代碼滿天飛……
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/115373.html
標籤:VB基礎類
