c++でのcsvの読み込み

気付けば一週間近く放置してた。
さすがに100記事超えるとネタ切れ感が強くて、この話は前にも書いた気がするって予感が下書きを書くたびによぎる。

そこでC++ネタでつなぐ。

1行のデータ数と行数が分かっているときのcsvファイルの読み取り。
カンマを見つけてそこで区切るってだけなんだが、C++だとこういう文字列を扱うのは結構面倒くさい。

int const data_width = 2; //1行のデータ数
int const data_length = 10080; //行数
double a[data_length][data_width];

string str = "filename";//ファイル名
fstream file;
	
file.open(str.c_str(), ios::in);
if(! file.is_open() ){
	return EXIT_FAILURE;
}
string tmp;
	
for(int k = 0; k < data_length; k++){
	getline(file, tmp);//一行分をtmpに読み込む。
		
	string::size_type pos = 0;//今の位置
	string::size_type prepos = 0;//さっきの位置
		
	char *stop;
		
	for(int i = 0; i < data_width; i++){//カンマを見つけて区切る。
		pos = tmp.find(",", pos);
		if(! (pos == string::npos) ){
			a[k][i] = strtod( (tmp.substr(prepos, pos-prepos)).c_str() ,&stop);
			pos++;
			prepos = pos;
		}else{
			a[k][i] = strtod( (tmp.substr(prepos, string::npos)).c_str() ,&stop);
		}
	}
}

file.close();

こんな感じで行列aに元のデータをdouble型でもって格納できます。