C++でCSVファイルを読み込む

CSVとはコンマ区切りのファイル形式です。例えば、下のような形式のデータはCSV形式です。このようなデータが格納されたファイルからデータを数値として読み込む方法を紹介します。

0,914,523
1,915,524
2,914,523
3,914,523

今回は初めにコードを示します。

#include <fstream>
#include <string>
#include <sstream>
#include <vector>

using namespace std;

vector<string> split(string& input, char delimiter)
{
    istringstream stream(input);
    string field;
    vector<string> result;
    while (getline(stream, field, delimiter)) {
        result.push_back(field);
    }
    return result;
}

int main()
{
    ifstream ifs("data.csv");

    string line;
    while (getline(ifs, line)) {
        
        vector<string> strvec = split(line, ',');
        
        for (int i=0; i<strvec.size();i++){
            printf("%5d\n", stoi(strvec.at(i)));
        }
        
    }
} 

以下は、上のコード中で使われている関数などの説明です。まず、main関数の前にコンマで文字列を分割するsplit関数を定義しています。この関数はstringという文字列型の引数をとり、分割処理をした後にvector<string>という複数の文字列を保持できる型に、分割したそれぞれを全て入れ込んで返します。この関数の中身については初心者には理解が難しいかもしれません。意味がわからなくても先に進みましょう。

main関数では、ます初めに ifstream ifs(“data.csv”); によってCSVファイルを開いています。次の、while (getline(ifs, line)) というのは、CSVファイルの最後の行までループを回すということを意味しており、getline関数で1行ずつ読み込んだ文字列をlineというstring型の変数に格納しています。このループの中でsplit関数を呼び出します。split関数の返り値を受け取れるように、同じvector<string>型のstrvecという変数を定義しています。次のforループでは、このstrvecの各要素に対してstoi関数で、文字列ー>整数値 への変換を行った上でprintf関数で出力しています。今回は、整数値へ変換するためにstoi関数を用いていますが、不動小数点型へと変換する場合にはstof関数を用いなければなりません。