C言語でCSVファイルを高速読み取り

概要

「,」で区切られたデータ形式のことをCSVと呼びます。
表計算の表現として各セルを「,」で区切って表現することもあります。

// data.csv
hello,world,!!!
ok,
input,data


意識する点は、文字列の先頭と「,」の位置です。
そして、「,」を終端記号「0」に置き換えるだけで簡単に分割できます。
(*文字列の先頭とは、各ワードの先頭を意味します。)


1.文字列の先頭の位置を記憶
2.「,」が現れるまでループ
3.「,」を見つけたら、「0」と置き換える。(input[i]=0)
4.次の文字の位置を先頭として記憶
5.繰り返し


また、高速で読むためには、fgetcやcin>>やcin.getlineでは遅いので
fgetsを使うとよいでしょう。


実装


0に置き換えることができれば、atoiもstrcpyもstrcmp使えるんでご自由に調理。

// split.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

const int MAX_N = 256;

int main()
{
    char input[MAX_N];

    while( fgets(input,MAX_N,stdin) )
    {
        int prev = 0;
        int next = 0;

        input[strlen(input)-1] = 0;

        for(next=0;input[next];next++)
        {
            if( input[next] == ',' )
            {
                input[next] = 0;
                printf("%s\n", &input[prev] );
                prev = next+1;
            }
        }

        if( prev != next ) printf("%s\n",&input[prev]);
    }

    return 0;
}


input[strlen(input)-1] = 0;は改行の分。windowsだと2文字かな?