C++メモ STLをできるだけ使ってCSVを読み込んでみる
野暮用で必要になったので。
ざっくりこんな感じ。
- fstreamクラスを使ってファイルを開く
- istringstreamクラスを使って区切り文字で文字列を分ける
- vectorクラスを使って分けた文字列をリストにする
んで、コード。
今回はCSVを読み込むのはメソッドにしとく事にして、こんな感じ。
// インクルード #include <iostream> #include <string> #include <vector> #include <fstream> #include <sstream> // ※istringstreamを使うために必要 // 名前空間 using namespace std; // // CSVを取得する // filename 読み込むファイル名 // table 読み込んだCSVの内容 // delimiter 区切り文字(今回はデフォルトでカンマ) // bool GetContents(const string& filename, vector<vector<string>>& table, const char delimiter = ',') { // ファイルを開く fstream filestream(filename); if (!filestream.is_open()) { // ファイルが開けなかった場合は終了する return false; } // ファイルを読み込む while (!filestream.eof()) { // 1行読み込む string buffer; filestream >> buffer; // ファイルから読み込んだ1行の文字列を区切り文字で分けてリストに追加する vector<string> record; // 1行分の文字列のリスト istringstream streambuffer(buffer); // 文字列ストリーム string token; // 1セル分の文字列 while (getline(streambuffer, token, delimiter)) { // 1セル分の文字列をリストに追加する record.push_back(token); } // 1行分の文字列を出力引数のリストに追加する table.push_back(record); } return true; }
んで、メインメソッドはこんな感じ。
あとの方のコードは結果の確認のためのもの。
// // メインメソッド // int main(int argc, const char * argv[]) { // 変数を定義する bool status = false; // メソッドのステータス string filename = "sample.csv"; // ファイル名 vector<vector<string>> table; // 読み込んだCSVファイルの内容 // CSVファイルの内容を取得する status = GetContents(filename, table); if (!status) { // 取得に失敗した場合はエラー終了する return -1; } // 確認のためにコンソールに内容を出力する for (int row = 0; row < table.size(); row++) { vector<string> record; // 1行分の内容 record = table[row]; // 1行分読み込む // 1セルずつ読み込んでコンソールに出力する for (int column = 0; column < record.size(); column++) { cout << record[column]; // 末尾の列でない場合はカンマを出力する if (column < record.size() - 1) { cout << ","; } } cout << endl; } return 0; }
サンプルのデータとして用意したsample.csvってファイルの内容はこんなん。
1,aaa,111 2,bbb,222 3,ccc,333
んで、実行したらこんな感じになった。
んま、メモってことで。
[amazonjs asin="4798119768″ locale="JP" title="独習C++ 第4版"]
ディスカッション
コメント一覧
const char delimiter = ‘,’は通りませんよ
ご指摘ありがとうございます!
記事で足りない情報がありお詫びいたします。
こちらの環境(Visual Studio 2019)で試してみたのですが、警告は出るもののビルドはとおりました。
また、デバッグ実行で試してみたのですが、記事に書いたような結果となりました。
もしお手間でなければ、コンパイラなど開発環境を教えていただけないでしょうか?
ピンバック & トラックバック一覧
[…] 1.C++での文字列の使い方まとめ 2.C++で文字列のsplit 3.getlineはsplitに使える 4.[C++]CSVファイルの読み込み […]
[…] 1.C++での文字列の使い方まとめ 2.C++で文字列のsplit 3.getlineはsplitに使える 4.[C++]CSVファイルの読み込み […]