15,980
社区成员
发帖
与我相关
我的任务
分享
//NAME: essaie bla bla
//DIMENSION: 8
//DATA
//1 14 15
//2 11 10
//3 6 4
//4 7 13
//5 9 21
//6 19 3
//7 1 5
//8 8 8
//EOF
//
// 文本文件中可能还含有其他内容,但是需要用到的内容即以上
//比如data.txt:
//NAME: essaie bla bla
//其它内容
//DIMENSION: 8
//其它内容
//DATA
//其它内容
//1 14 15
//其它内容
//2 11 10
//其它内容
//3 6 4
//其它内容
//4 7 13
//其它内容
//5 9 21
//其它内容
//6 19 3
//其它内容
//7 1 5
//其它内容
//8 8 8
//其它内容
//EOF
// 目标是要获取NAME后字串,DIMENSION后数值,以及DATA以下的数值
// 其中NAME就是随便个字句,DIMENSION是城市数量,DATA以下是城市编号,X坐标,Y坐标
// 所有的这些将赋值给一个事先定义好的结构
#include <stdio.h>
#include <string.h>
#define MAXCPL 80 //每行最大字符数
#define MAXCITY 100 //每组数据中DATA最多项数,DIMENSION的最大值
#define MAXNAMEL 32 //NAME最大长度
struct S {
char NAME[MAXNAMEL+1];
int DIMENSION;
struct D {
int NO;
int X;
int Y;
} DATA[MAXCITY];
} s;
FILE *f;
int st,n,i;
char ln[MAXCPL];
int main() {
f=fopen("data.txt","r");
if (NULL==f) {
printf("Can not open file data.txt!\n");
return 1;
}
st=0;
n=0;
while (1) {
if (NULL==fgets(ln,MAXCPL,f)) break;
if (st==0) {
if (1==sscanf(ln,"NAME: %31[^\n]",s.NAME)) st=1;
} else if (st==1) {
if (1==sscanf(ln,"DIMENSION: %d",&s.DIMENSION)) st=2;
} else if (st==2) {
if (0==strcmp(ln,"DATA\n")) st=3;
} else if (st==3) {
if (3==sscanf(ln,"%d%d%d",&s.DATA[n].NO,&s.DATA[n].X,&s.DATA[n].Y)) {
n++;
if (n>=MAXCITY || n>=s.DIMENSION) break;
}
}
}
fclose(f);
printf("s.NAME=[%s]\n",s.NAME);
printf("s.DIMENSION=%d\n",s.DIMENSION);
for (i=0;i<n;i++) {
printf("s.DATA[%d].NO,X,Y=%d,%d,%d\n",i,s.DATA[i].NO,s.DATA[i].X,s.DATA[i].Y);
}
return 0;
}
//s.NAME=[essaie bla bla]
//s.DIMENSION=8
//s.DATA[0].NO,X,Y=1,14,15
//s.DATA[1].NO,X,Y=2,11,10
//s.DATA[2].NO,X,Y=3,6,4
//s.DATA[3].NO,X,Y=4,7,13
//s.DATA[4].NO,X,Y=5,9,21
//s.DATA[5].NO,X,Y=6,19,3
//s.DATA[6].NO,X,Y=7,1,5
//s.DATA[7].NO,X,Y=8,8,8
//两个csv文件,
//第一个文件的第一列+第三列的内容,
//第二个文件的第一列+第二列的内容
//作为唯一的关键字来进行合并。
//两个文件的顺序都是无序的,并且行数都在30万行左右。
//
//文件1.csv:
//aaa,123,bbb,234,345
//aaa,123,ccc,234,345
//bbb,123,ccc,234,345
//ccc,123,ddd,234,345
//
//文件2.csv:
//aaa,bbb,123,234,345
//aaa,ccc,567,234,345
//
//合并文件12.csv:
//aaa,123,bbb,234,345,123,234,345
//aaa,123,ccc,234,345,567,234,345
//bbb,123,ccc,234,345,,,
//ccc,123,ddd,234,345,,,
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>
#define MAXF 8 //每字段最多字符
#define MAXW 80 //每行最大宽度
#define MAXL 350000 //每个文件最多行数
char *s,*p,*c1,*c2;
FILE *f;
int n,L,i;
int compare(const void *arg1,const void *arg2) {
return strcmp((char *)arg1,(char *)arg2);
}
int main() {
s=(char *)calloc(MAXL*2*MAXW,1);
f=fopen("1.csv","r");
if (NULL==f) {
printf("Can not open file 1.csv!\n");
return 1;
}
n=0;
p=s;
while (1) {
if (NULL==fgets(p,MAXW,f)) break;
L=strlen(p)-1;
p[L]=0;//删掉行尾的'\n'
c1=strchr(p,',');
c2=strchr(c1+1,',');
memcpy(p+L+1,c1+1,c2-c1);//将第二列拷贝到行尾'\0'的后面
memmove(c1+1,c2+1,L-(c1-p)+1+(c2-c1)+1);//从第三列开始后面所有内容往左挪一列
n++;
p+=MAXW;
}
fclose(f);
f=fopen("2.csv","r");
if (NULL==f) {
printf("Can not open file 2.csv!\n");
return 1;
}
while (1) {
if (NULL==fgets(p,MAXW,f)) break;
L=strlen(p)-1;
p[L]=0;//删掉行尾的'\n'
n++;
p+=MAXW;
}
fclose(f);
// p=s;
// for (i=0;i<n;i++) {
// L=strlen(p);
// if (p[L+1]) {//来自1.csv
// printf("%s|%s\n",p,p+L+1);
// } else {
// printf("%s\n",p);
// }
// p+=MAXW;
// }
qsort((void *)s,n,MAXW,compare);
// printf("sorted:\n");
// p=s;
// for (i=0;i<n;i++) {
// L=strlen(p);
// if (p[L+1]) {//来自1.csv
// printf("%s|%s\n",p,p+L+1);
// } else {
// printf("%s\n",p);
// }
// p+=MAXW;
// }
f=fopen("12.csv","w");
if (NULL==f) {
printf("Can not create file 12.csv!\n");
return 1;
}
p=s;
for (i=0;i<n;i++) {
c1=strchr(p,',');
c2=strchr(c1+1,',');
if (0==strncmp(p,p+MAXW,c2-p+1)) {//本行和下一行前两列相同
L=strlen(p);
if (p[L+1]) {//本行来自1.csv
fprintf(f,"%.*s",(c1-p)+1,p);//输出本行第一列
fprintf(f,"%s",p+L+1);//输出本行被挪到行尾的第二列
fprintf(f,"%s,",c1+1);//输出本行其余列
fprintf(f,"%s\n",c2+1+MAXW);//输出下行第三列之后内容
i++;
p+=MAXW;
} else {//下行必然来自1.csv
fprintf(f,"%.*s",(c1-p)+1,p+MAXW);//输出下行第一列
L=strlen(p+MAXW);
fprintf(f,"%s",p+L+1+MAXW);//输出下行被挪到行尾的第二列
fprintf(f,"%s,",c1+MAXW+1);//输出其余列
fprintf(f,"%s\n",c2+1);//输出本行第三列之后内容
i++;
p+=MAXW;
}
} else {
L=strlen(p);
if (p[L+1]) {//来自1.csv
fprintf(f,"%.*s",(c1-p)+1,p);//输出第一列
fprintf(f,"%s",p+L+1);//输出被挪到行尾的第二列
fprintf(f,"%s,,,\n",c1+1);//输出其余列
} else {//来自2.csv
fprintf(f,"%s\n",p);
}
}
p+=MAXW;
}
fclose(f);
free(s);
return 0;
}