用C语言解析一个.csv的文件 并且输出一个.csv的文件


在一个固定的路径下路,读取一个.csv文件,在TXT下面显示如下:
Raw Data,S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13
D0,2457,2588,2272,2230,2240,2217,2228,2220,2262,2423,2264,2143,2309,2195
D1,3078,2902,2902,2955,2799,2807,2787,2772,2818,3087,2990,2710,3037,2711
D2,2938,3065,3092,2814,2826,3028,2788,2799,2756,2771,2765,2767,3063,2330
D3,2929,2992,2915,2814,2811,2874,2782,2777,2785,2755,2919,3094,2913,2332

要把里面的的数据保存在一个数组里面array,还需要把D3和S13这两个数字大小存起来,这两个数字是可以变化的。

然后把数据array存档,输出一个.csv文档,放在一个固定的目录下面,格式如下
Initial Code:, SSD6250_AM070PB01A_v2_15_2_20150415_v1.txt, 
Patch Code:, SSD6250_Patch_V2_15_2_8B1E.txt, 

Test Result: , Pass,
Device Type: , SSD6270,
Test Time: , 2015-05-08, 19:53:46.616,
Open/Short Test: , Passed ,
Max RawData: , 5347,
Min RawData: , 3592,
Bad Raw Count: , 0,

Raw Average ,S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,
D0,4619,4683,4643,4603,4570,4785,4679,4634,4707,4462,4343,3918,3931,3953,3923,3855,3954,3898,3937,3966,3903,4063,3803,
D1,5081,5347,5219,5121,5139,5309,5263,5240,5237,5086,4969,3893,3846,3753,3592,3651,3626,3692,3652,3670,3773,3837,3688,
D2,5047,5188,5167,5114,5096,5244,5223,5238,5181,5033,4843,4082,4104,4062,3900,3930,3979,3966,3923,3949,4001,4102,3812,
D3,4974,5227,5120,5096,5093,5197,5111,5223,5229,5045,4745,4382,4435,4436,4340,4310,4310,4326,4281,4286,4307,4402,4007,


坐等大神回答~

4 个解决方案

#1


参照这个库也许能帮到你
http://www.cnblogs.com/life2refuel/p/5265167.html

#2


不知道你到底要干什么,输入输出完全不一样

#3


这个应该能帮到你

#include <fstream> //使用文件流
#include <iostream>
using namespace std; //文件流定义在std命名空间
struct BOOK { //书籍销售记录类型
    char c[5]; //产品代码
    char n[11];//产品名称
    int p;
    int q;
};
int main()
{
    BOOK a; //书籍销售记录数组 
ios_base::openmode m=ios_base::in|ios_base::out;  //可读可写
    ifstream inf("E:\\book.dat",m); //打开文件读
   
    fstream iof("E:\\out.dat",m|ios_base::trunc|ios_base::binary);  //新建二进制文件
 
    if (inf.fail() || iof.fail())
{
    
printf("open file failed!\n");
return -1; //文件打开失败退出运行
}
    while(!inf.eof()) { //是否读到文件末尾
        inf>>a.c>>a.n>>a.p>>a.q; //读ASCII文件
        iof.write((char*)&a,sizeof(BOOK)); //写二进制文件
        cout<<a.c<<'\t'<<a.n<<'\t'<<a.p<<'\t'<<a.q<<"...."<<endl;
    }
    inf.close(); //关闭book.dat文件
    iof.seekg(0*sizeof(BOOK),ios_base::beg); //定位第1个结构体
    iof.read((char*)&a,sizeof(BOOK)); //读取第1个结构体
    iof.seekg(-1*sizeof(BOOK),ios_base::end); //定位最后1个结构体
    iof.write((char*)&a,sizeof(BOOK)); //写入最后1个结构体
    iof.close(); //关闭out.dat文件
 
    ifstream inf2("out.dat"); //打开文件读
    if (inf2.fail()) return -1; //文件打开失败退出运行
    while(!inf2.eof()) { //是否读到文件末尾
        inf2>>a.c>>a.n>>a.p>>a.q; //读ASCII文件
        cout<<a.c<<'\t'<<a.n<<'\t'<<a.p<<'\t'<<a.q<<"_______"<<endl;
    }
    inf2.close();
    return 0;
}

#4


仅供参考:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include <locale.h>
#define MAXF 256    //每行最多列数
#define MAXC 2048   //每列最多字符数+1
#define MAXW 16000  //每行最多字符数
static int maxw[MAXF];//扫描一遍得出的每列最大宽度
int maxf[MAXF];//扫描一遍得出的每列属性:-1字符串(左对齐)|0纯数字(右对齐)|>0带小数点数字的最多小数位数(按小数点对齐)
char d[MAXF][MAXC];
char ln[MAXW];
static int s,i,n,L,k,cn,pc,w,rn,nn,cl,lcl,r,wed,dt,f,o1;
char c,*p,*pp;
FILE *fi,*fo;
char delims[256];
int delimsL;
char ag;
int agdelims2gap(int col,char c) {
    if ('a'==ag) {
        if (strchr(delims,c)) return 1;
        else return 0;
    } else {//'g'==ag
        if (col>=delimsL) col=delimsL-1;//后面各列使用指定列间隔字符列表中最后的那个字符
        if (c==0) return delims[col];//c为0时返回col列后面在指定列间隔字符列表中对应的间隔字符
        if (delims[col]==c) return 1;
        else return 0;
    }
}
char *strlrtrim_c2c(char *s) {//将s两头的' '或'\t'去掉,并将其中的delims字符','或指定列间隔字符集合中的字符替换为';'
    char *s1;

    while (1) {
        if (*s==' '||*s=='\t') s++;
        else break;//
    }
    s1=s;
    while (1) {
        if (*s==0) break;//
        if ('a'==ag) {
            if (strchr(delims,*s)) {*s=';';rn++;} //指定列间隔字符集合时,将集合中的字符替换为';'
        } else {//'g'==ag
            if (','==*s) {*s=';';rn++;} //指定列间隔字符列表时,仅将','替换为';'
        }
        s++;
    }
    while (1) {
        if (s1==s) break;
        s--;
        if (!(*s==' '||*s=='\t')) {
            *(s+1)=0;
            break;//
        }
    }
    return s1;
}
int strflg(char *ss) {//-1字符串(左对齐)|0纯数字(右对齐)|>0带小数点数字的最多小数位数(按小数点对齐)
    int isd;

    isd=-1;
while (1) {
if (*ss==0) break;//
if (*ss=='.') {
isd=1;
} else if ('0'<=*ss && *ss<='9') {
if (isd<1) isd=0;
else isd++;
} else {
isd=-1;
break;
}
ss++;
}
return isd;
}
void outf(int cc) {//-1字符串(左对齐)|0纯数字(右对齐)|>0带小数点数字的最多小数位数(按小数点对齐)
if (o1) {
o1=0;
p=strlrtrim_c2c(d[cc]);
if (-1==maxf[cc])
fprintf(fo,"%-*s",maxw[cc],p);
else if (0==maxf[cc])
fprintf(fo,"%*s",maxw[cc],p);
else {
if (0==L) {
if (-1==strflg(p))
fprintf(fo,"%-*s",maxw[cc]+maxf[cc],p);
else
fprintf(fo,"%*s%s%*s",maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
} else {
fprintf(fo,"%*s%s%*s",maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
}
}
} else {
c=',';
if ('g'==ag) c=agdelims2gap(cc-1,0);
p=strlrtrim_c2c(d[cc]);
if (-1==maxf[cc])
fprintf(fo,"%c%-*s",c,maxw[cc],p);
else if (0==maxf[cc])
fprintf(fo,"%c%*s",c,maxw[cc],p);
else {
if (0==L) {
if (-1==strflg(p))
fprintf(fo,"%c%-*s",c,maxw[cc]+maxf[cc],p);
else
fprintf(fo,"%c%*s%s%*s",c,maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
} else {
fprintf(fo,"%c%*s%s%*s",c,maxw[cc]-(strchr(p,'.')?strchr(p,'.')-p:strlen(p)),"",p,maxf[cc]-strflg(p),"");
}
}
}
}
int main(int argc,char **argv) {
setlocale(LC_ALL,"chs");
if (argc>1 && 0==strcmp(argv[1],"/?")) goto USAGE;
strcpy(delims,",");
if (argc>=2) {
ag=argv[1][0];
if ('a'!=ag && 'g'!=ag) goto USAGE;
strcpy(delims,argv[1]+1);
if (0==delims[0]) strcpy(delims,",");
}
delimsL=strlen(delims);
for (i=0;i<MAXF;i++) maxf[i]=-1;
fi=fopen("in.csv","r");
if (NULL==fi) {
fprintf(stderr,"无法打开文件in.csv!\n",argv[0]);
USAGE:
fprintf(stderr,"用法:%s [a|g[delims] [1,3-5,1,100-99]]\n将in.csv中各列两端的空白去掉,双引号中的','或指定列间隔字符替换为';'[且[a指定列间隔字符集合各列对齐|g指定列间隔字符列表各列对齐] [输出第1,3-5,1,100-99列]]\n",argv[0]);
return 1;
}
fo=fopen("out.csv","w");
pc=0;
AGAIN:
rn=0;
rewind(fi);
L=0;
while (1) {
if (NULL==fgets(ln,MAXW,fi)) break;//
if ('\n'!=ln[strlen(ln)-1]) {
fprintf(stderr,"in.csv中第%d行太长(>%d个字符)!",L+1,MAXW);
fclose(fo);
fclose(fi);
return 1;
}
ln[strlen(ln)-1]=0;
s=0;
i=0;
n=0;
p=ln;
while (1) {
c=ln[i];
switch (s) {
case 0://开始
if (c==0) goto SHOW;
if (c=='\"') {
s=1;
p=ln+i;
} else if (agdelims2gap(n,c)) {
k=__min((ln+i)-p,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
if (n>=MAXF) {
fprintf(stderr,"警告:in.csv中第%d行多于%d的字段被忽略。\n",L+1,MAXF);
goto SHOW;
}
p=ln+i+1;
s=3;
} else if (c==' ' || c=='\t') {
p=ln+i+1;
} else {
s=2;
p=ln+i;
}
break;
case 1://双引号中
if (c==0) {
fprintf(stderr,"in.csv中第%d行第%d个字符处格式错误!期望双引号。\n",L+1,i);
fclose(fo);
fclose(fi);
return 1;
}
if (c=='\"' && (agdelims2gap(n,ln[i+1]) || ln[i+1]==0 || ln[i+1]==' ' || ln[i+1]=='\t')) {
k=__min((ln+i)-p+1,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
if (n>=MAXF) {
fprintf(stderr,"警告:in.csv中第%d行多于%d的字段被忽略。\n",L+1,MAXF);
goto SHOW;
}
if (ln[i+1]==0) goto SHOW;
if (agdelims2gap(n,ln[i+1])) {
i++;
p=ln+i+1;
s=3;
} else {//' '或'\t'
s=4;
}
} else if (c=='\"' && ln[i+1]=='\"') {//连续两个双引号代表一个双引号
i++;
}
break;
case 2://非双引号中
if (c==0) {
k=__min((ln+i)-p,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
goto SHOW;
}
if (c=='\"') {
fprintf(stderr,"in.csv中第%d行第%d个字符处格式错误!此处不应出现双引号。\n",L+1,i);
fclose(fo);
fclose(fi);
return 1;
}
if (agdelims2gap(n,c)) {
k=__min((ln+i)-p,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
if (n>=MAXF) {
fprintf(stderr,"警告:in.csv中第%d行多于%d的字段被忽略。\n",L+1,MAXF);
goto SHOW;
}
p=ln+i+1;
s=3;
}
break;
case 3://逗号后
if (c==0) {
k=__min((ln+i)-p,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
goto SHOW;
}
if (c=='\"') {
s=1;
p=ln+i;
} else if (agdelims2gap(n,c)) {
k=__min((ln+i)-p,MAXC-1);strncpy(d[n],p,k);d[n][k]=0;
n++;
if (n>=MAXF) {
fprintf(stderr,"警告:in.csv中第%d行多于%d的字段被忽略。\n",L+1,MAXF);
goto SHOW;
}
p=ln+i+1;
} else {
s=2;
p=ln+i;
}
break;
case 4://双引号后连续的' '或'\t'
if (c==0) goto SHOW;
if (agdelims2gap(n,c)) {
p=ln+i+1;
s=0;
} else if (c!=' ' && c!='\t') {
fprintf(stderr,"in.csv中第%d行第%d个字符处格式错误!期望逗号。\n",L+1,i);
fclose(fo);
fclose(fi);
return 1;
}
break;
}
i++;
}
SHOW:
if (0==L) cn=n;
else if (cn!=n) if (!kbhit()) fprintf(stderr,"警告:in.csv中第%d行数据列数%d不等于第1行数据列数%d!\n",L+1,n,cn);
// if (n!=MAXF) fprintf(stderr,"警告:第%d行数据列数%d不等于%d!\n",L+1,n,MAXF);
// printf("第%d行%d列:",L+1,n);
if (argc>2 && pc) {
s=0;
o1=1;
pp=argv[2];//1,3-5,1,100-99
while (1) {
r=sscanf(pp,"%d%n",&cl,&nn);
if (1==r) {
if (1<=cl) {
if (cl<=n) outf(cl-1);
lcl=cl;
s=1;
} else if (cl<=-1 && 1==s) {
cl=-cl;
if (lcl<cl) {
for (i=lcl+1;i<=cl;i++) {
if (i<=n) outf(i-1);
}
} else if (lcl>cl) {
for (i=lcl-1;i>=cl;i--) {
if (i<=n) outf(i-1);
}
}
s=0;
} else {
if (!wed) {
fprintf(stderr,"警告:指定输出的某些列不存在!\n");
wed=1;
}
}
pp+=nn;
} else if (0==r) {
s=0;pp++;
} else break;//
}
fprintf(fo,"\n");
L++;
continue;
}
if (argc>1) {
if (0==pc) {
for (i=0;i<n;i++) {
p=strlrtrim_c2c(d[i]);
f=strflg(p);if (f>maxf[i]) maxf[i]=f;
if (f>0 && L>0) {//检测是否带小数点数字忽略第一行标题行
w=strchr(p,'.')?strchr(p,'.')-p:strlen(p);if (w>maxw[i]) maxw[i]=w;
} else {
w=strlen(p);   if (w>maxw[i]) maxw[i]=w;
}
}
} else {
o1=1;
for (i=0;i<n;i++) outf(i);
fprintf(fo,"\n");
}
} else {
for (i=0;i<n;i++) {
p=strlrtrim_c2c(d[i]);
if (0==i)
fprintf(fo,"%s" ,p);
else
fprintf(fo,",%s" ,p);
}
fprintf(fo,"\n");
}
L++;
}
pc++;
if (argc>1 && 1==pc) goto AGAIN;
fclose(fo);
fclose(fi);
if (argc>2)
printf("in.csv中共%d行(双引号中的%d个','或指定列间隔字符替换为';'且各列对齐输出第%s列)已导出到文件out.csv中。\n",L,rn,argv[2]);
else if (argc>1)
printf("in.csv中共%d行(双引号中的%d个','或指定列间隔字符替换为';'且各列对齐)已导出到文件out.csv中。\n",L,rn);
else
printf("in.csv中共%d行(双引号中的%d个','或指定列间隔字符替换为';')已导出到文件out.csv中。\n",L,rn);
while (kbhit()) getch();
return 0;
}
//d:\>type in.csv
//fl,number;float-str,n,c
//12.3,2;12.3-a4,5,6
//45.0,123;12345.0-,,
//1.23,;1.234-abcd,,c
//
//d:\>csv
//in.csv中共4行(双引号中的0个','或指定列间隔字符替换为';')已导出到文件out.csv中。
//
//d:\>type out.csv
//fl,number;float-str,n,c
//12.3,2;12.3-a4,5,6
//45.0,123;12345.0-,,
//1.23,;1.234-abcd,,c
//
//d:\>csv a
//in.csv中共4行(双引号中的0个','或指定列间隔字符替换为';'且各列对齐)已导出到文件out.csv中。
//
//d:\>type out.csv
//fl   ,number;float-str,n,c
//12.3 ,2;12.3-a4 ,5,6
//45.0 ,123;12345.0- , ,
// 1.23,;1.234-abcd , ,c
//
//d:\>csv a,;-
//in.csv中共4行(双引号中的0个','或指定列间隔字符替换为';'且各列对齐)已导出到文件out.csv中。
//
//d:\>type out.csv
//fl   ,number,float ,str ,n,c
//12.3 ,  2,   12.3 ,a4  ,5,6
//45.0 ,   123,12345.0 ,  , ,
// 1.23,   ,    1.234,abcd, ,c
//
//d:\>csv g,;-,
//in.csv中共4行(双引号中的0个','或指定列间隔字符替换为';'且各列对齐)已导出到文件out.csv中。
//
//d:\>type out.csv
//fl   ,number;float -str ,n,c
//12.3 ,  2;   12.3 -a4  ,5,6
//45.0 ,   123;12345.0 -  , ,
// 1.23,   ;    1.234-abcd, ,c
//
//d:\>del in.csv
//
//d:\>csv
//无法打开文件in.csv!
//用法:csv [a|g[delims] [1,3-5,1,100-99]]
//将in.csv中各列两端的空白去掉,双引号中的','或指定列间隔字符替换为';'[且[a指定列间隔字符集合各列对齐|g指定列间隔字符列表各列对齐] [输出第1,3-5,1,100-99列]]
//
//d:\>

注意!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系我们删除。



 
  © 2014-2022 ITdaan.com 联系我们: