タイトルの通り、csvファイルをstd::vectorを用いた二次元配列に変換するコードを紹介します。
csvファイルを二次元配列に変換するコード
コード
タイトル:main.cpp
#include <vector> #include <string> #include <fstream> #include <iostream> //文字列のsplit機能 std::vector<std::string> split(std::string str, char del) { int first = 0; int last = str.find_first_of(del); std::vector<std::string> result; while (first < str.size()) { std::string subStr(str, first, last - first); result.push_back(subStr); first = last + 1; last = str.find_first_of(del, first); if (last == std::string::npos) { last = str.size(); } } return result; } std::vector<std::vector<std::string> > csv2vector(std::string filename, int ignore_line_num = 0){ //csvファイルの読み込み std::ifstream reading_file; reading_file.open(filename, std::ios::in); if(!reading_file){ std::vector<std::vector<std::string> > data; return data; } std::string reading_line_buffer; //最初のignore_line_num行を空読みする for(int line = 0; line < ignore_line_num; line++){ getline(reading_file, reading_line_buffer); if(reading_file.eof()) break; } //二次元のvectorを作成 std::vector<std::vector<std::string> > data; while(std::getline(reading_file, reading_line_buffer)){ if(reading_line_buffer.size() == 0) break; std::vector<std::string> temp_data; temp_data = split(reading_line_buffer, ','); data.push_back(temp_data); } return data; } int main(int argc, char *argv[]){ //csv2vectorの実行 std::vector<std::vector<std::string> > data = csv2vector(argv[1], 1); //二次元配列dataの標準出力への出力 for(int i = 0; i < data.size(); i++){ for(int j = 0; j < data[i].size(); j++){ std::cout << data[i][j] << ","; } std::cout << std::endl; } }
関数の使い方
タイトル:使い方
std::string filename = "sample.csv"; std::vector<std::vector<std::string> > vector_data_1 = csv2vector(filename); std::vector<std::vector<std::string> > vector_data_2 = csv2vector(filename, 1);
上記のように引数にファイル名を入力して使用します。また、第二引数に整数値Iを入力することでI行分だけ読み飛ばしてvectorを作成します。csvのヘッダーを読み飛ばしたい場合には第二引数に1を指定することでヘッダー以外の行のvectorを作成することができます。
csv2vector()では文字列をカンマ区切りでvectorにするためにsplit()を用いています。splitの第二引数では区切り文字を指定できるので、タブ文字を指定することでtsv形式のファイルもvectorに変換することが可能です。
使い方の例
使い方は以下の通りです。サンプルとしてsample.csvをvectorに変換して標準出力に出力します。
タイトル:sample.csv
id,name,age hoge,tanaka taro,45 fuga,matsumoto kyoko,35
タイトル:コンパイル(g++)
$ g++ main.cpp -o main.out
タイトル:実行コマンド
$ ./main.out sample.csv
実行結果は次のようになります。ヘッダーは読み飛ばしての実行結果になります。
タイトル:出力
$ ./main.out sample.csv hoge,tanaka taro,45, fuga,matsumoto kyoko,35,