野暮用で必要になったので。
ざっくりこんな感じ。
- 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
んで、実行したらこんな感じになった。
んま、メモってことで。
