① 關於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]='