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文字かな?