format_list_bulleted
【C++】C++でcsv形式のファイルをvectorの二次元配列に変換するコードを紹介
最終更新日時:2020-12-29 12:06:30



タイトルの通り、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,