① 关于c语言读CSV文件的问题
csv文件即逗号分隔值文件。
逗号分隔值(Comma-Separated Values,CSV,有时也称为字符分隔值,因为分隔字符也可以不是逗号),其文件以纯文本形式存储表格数据(数字和文本)。
纯文本意味着该文件是一个字符序列,不含必须像二进制数字那样被解读的数据。
CSV文件由任意数目的记录组成,记录间以某种换行符分隔;每条记录由字段组成,字段间的分隔符是其它字符或字符串,最常见的是逗号或制表符。通常,所有记录都有完全相同的字段序列。
要用C语言读取CSV,首先需要确定文件中定义的字符分隔值,以及每一行各个列的元素格式。
如果所有的元素格式相同,那么可以每行一个一维数组,所有行组成一个二维数组,逐个元素进行读取。
如果元素格式不同,可以按照元素类型,构建一个结构体,每行读到一个结构体变量中,所有行组成一个结构体数组。
下面根据两种情况,按照分隔符为逗号(,),分别举一个例子:
文件名设定为in.csv,每行10个元素。
一、所有元素均相同类型,比如int型。
#include<stdio.h>
intmain()
{
FILE*fp;
inta[100][10];//定义一个足够大的数组来存储。
intline=0;
intc,i;
fp=fopen("in.csv","r");//以文本方式打开。
if(fp==NULL)return-1;//打开文件失败。
while(1)
{
i=0;//列标记清零。
while(1)
{
fscanf(fp,"%d",&a[line][i]);//从文件禅乱中读取一个元素。
c=getchar();//读取下一个字符,可能是分隔符,换行符或文件结尾。
if(c==' '||c==EOF)break;//读完一行,或者到文件结尾,退出读取。
i++;
}
line++;
if(c==EOF)break;
}
fclose(fp);//关闭文件。
//以下循环用来打印所有读到的值。
for(i=0;i<line;i++)
{
for(c=0;c<10;c++)
printf("%d",a[i][c]);
printf(" ");
}
}
二、每行元素不同。
比如共三列,第一列是int型,第二列是字符串,第三列是float型。
如果分隔符不是空白字符,或者字符串元素中可能存在除分隔符外的其它空白字符,在读取搏袭御字符串的时候是不能用fscanf函数的。
定义结构体如下
strcutdata
{
inta;
chars[100];//根据实际要求,定义足够大的字符数组。
floatf;
};
读取代码如下:
#include<stdio.h>
intmain()
{
FILE*fp;
strcutdataa[100];//定义基岩一个足够大的结构体一维数组来存储。
intline=0;
intc,i;
fp=fopen("in.csv","r");//以文本方式打开。
if(fp==NULL)return-1;//打开文件失败。
while(1)
{
fscanf(fp,"%d",&a[line].a);//从文件中读取第一个元素。
c=getchar();//读取分隔符。
//接下来要读取字符串,需要逐个字符读入,直到出现分隔符为止。
i=0;
while(1)
{
a[line].s[i]=getchar();//读入一个字符。
if(a[line].s[i]==',')//发现分隔符
{
a[line].s[i]='