CSVファイルを関数fscanf()で読み取る

CSVファイルとはMicrosoftExcelでの入出力が便利にできているファイル形式で,Excelの各セルの内容がカンマ(,)で区切られた形式のファイルである。

excel画面 CSVファイル
  A B C D
1 123 456 789 1234
2 2.30 3.30 4.30 5.30
3 abc def ghi jkl
123,456,789,1234
2.30,3.30,4.30,5.30
abc,def,ghi,jkl

このCSVファイルを読み取るときに
1行目はfscanf(fp,"%d,%d,%d,%d",&a,&b,&c,&d);のように書くことができる
2行目はfscanf(fp,"%lf,%lf,%lf,%lf",&p,&q,&r,&s);のように書くことができる
しかし%sの書式はカンマで区切ることができないので,工夫を要する。

そこで次のようにscanfを使うことができる。これはscanfの詳細な説明が必要になる。
詳細な説明は,別のところに譲る。

CSVファイルを関数fscanf()で読み取るプログラム例

#include "stdio.h"
#include "string.h"

int main()
{
    FILE *fp;
    int num;
    static char txt[7][256];
    int data[10][4];
    int i,j;
    fp=fopen("tt.csv","r");
    fscanf(fp,"%d",&num);
    fscanf(fp,"%*[\n ]%[^,],%[^,],%[^,],%[^,],%[^,],%[^,],%[^\n]",txt[0],txt[1],txt[2],txt[3],txt[4],txt[5],txt[6]);
    i=0;
    while(fscanf(fp,"%d,%d,%d,%d",&data[i][0],&data[i][1],&data[i][2],&data[i][3])==4) i++;
    printf("num=%d\n",num);
    for (i=0;i<7;i++) printf("%d:[%s]\n",i,txt[i]);
    for (i=0;i<3;i++) {
        for (j=0;j<4;j++) printf("%10d",data[i][j]);
        printf("\n");
    }
    fclose(fp);
    return 0;
}

読み込んだファイル tt.csv 文字列データには空白も含まれている

123
test1,test2,test3,space 1,space 2,abc,xyz/xyz
12,23,34,45
23,34,45,56
10,20,30,40

実行結果 (うまく読めているのがわかる)

>tt.exe
num=123
0:[test1]
1:[test2]
2:[test3]
3:[space 1]
4:[space 2]
5:[abc]
6:[xyz/xyz]
        12        23        34        45
        23        34        45        56
        10        20        30        40