前提・実現したいこと
csvを読み込み、特定の列の2行目以降のセルの値を、セルの値がなくなるまでvector<string>に格納したいです。
例)「値R」の数値をVector<string> csvData = {0.4, 0.4, 0.47, 0.404}のように格納
※csvのデータがさらに書き込まれた場合にもVector<string> csvDataが自動で書き込まれたセルの値を格納できるようにしたいため、「セルの値がなくなるまで」Vector<string> csvDataに格納したいです。
例)"値R"の数値が、「0.4, 0.4, 0.47, 0.404」→「0.4, 0.4, 0.47, 0.404, 0.3, 0.25, 0.78」と上書きされたとき、
Vector<string> csvData = {0.4, 0.4, 0.47, 0.404} → csvData = {0.4, 0.4, 0.47, 0.404, 0.3, 0.25, 0.78}にコードを書き直さなくても格納できる状態
発生している問題・エラーメッセージ
①セルの値をstring型でとっているため、以下「該当のソースコード」のように書くとvector<string>型とデータ型があっておらず、以下のエラーが出てしまいます。
これらのオペランドと一致する演算子 "=" はありません
該当のソースコード
cpp
1#include <iostream> 2#include <fstream> 3#include <map> 4#include <sstream> 5#include <string> 6#include <vector> 7 8using std::cout; using std::endl; 9using std::ifstream; using std::string; 10using std::getline; using std::istringstream; 11using std::vector; 12 13/** 14*csvファイルから指定された行の文字列を取得する 15*@param fin 16*@param col_row 行番号 17*@return csvファイルの指定された行の文字列 18*/ 19[[nodiscard]]string get_row(ifstream& fin, int row) { 20 try { 21 int cur_row = 1; //読み込んだ行数。先頭行は読み込み済みだから「1」を初期値に指定 22 string line; //ファイルの行を格納する変数 23 24 while (getline(fin, line)) { //ファイルを1行ずつ読み込む 25 if (cur_row == row) { //指定された行が見つかった 26 return line; //行の文字列を返す 27 } 28 ++cur_row; 29 } 30 throw "指定された行が見つかりませんでした"; //指定された行が見つからないときは例外を投げる 31 } 32 catch (char const* message) { 33 34 } 35} 36 37/** 38*csvファイルの行の文字列から指定された列のセルの値を取得する 39*@param line csvファイルの行の文字列 40*@param col 列番号 41*@return csvセルの値 42*/ 43[[nodiscard]] string get_cell(string line, int col) { 44 try { 45 string token; //分割したセルの値を格納する変数 46 int cur_col = 0; //処理中の列の列番号 47 istringstream stream(line); //行の文字列をカンマで分割 48 49 while (getline(stream, token, ',')) { 50 if (cur_col == col) { //指定されたセルが見つかった 51 return token; //セルの値を返す 52 } 53 ++cur_col; //次のセルへ 54 } 55 throw "指定されたセルが見つかりませんでした"; //指定されたセルが見つからないときは例外を投げる 56 } 57 catch (char const* message) { 58 59 } 60} 61 62/** 63*csvファイルから指定したセルの値を取得する 64*@param filename csvファイルのファイル名 65*@param row 行番号 66*@aram col_name 列名 67*/ 68[[nodiscard]] string get_data(int row) { 69 string filename("csvSearch_test.csv"); 70 ifstream fin(filename); //ファイルを開く 71 int col = 2; //"値R"の列番号 72 string line = get_row(fin, row); //csvファイルの指定された行の文字列を取得 73 return get_cell(line, col); //行の文字列からセルの値を取得 74} 75 76int main() 77{ 78 vector<string> csvData; 79 int i = 2; 80 int q = 0; 81 82 while (get_data(i) == "") { 83 csvData = get_data(i); 84 cout << csvData[i] << endl; //vector<string> csvDataに入ったか確認用 85 86 i++; 87 q++; 88 } 89}
↓int32_t様ご助力のコード
cpp
1#include <iostream> 2#include <fstream> 3#include <map> 4#include <sstream> 5#include <string> 6#include <vector> 7#include <optional> 8 9using std::cout; using std::endl; 10using std::ifstream; using std::string; 11using std::getline; using std::istringstream; 12using std::vector; 13using std::optional; 14using std::nullopt; 15 16/** 17*csvファイルの行の文字列から指定された列のセルの値を取得する 18*@param line csvファイルの行の文字列 19*@param col 列番号 20*@return csvセルの値 21*/ 22optional<string> get_cell(string line, int col) { 23 24 string token; //分割したセルの値を格納する変数 25 int cur_col = 0; //処理中の列の列番号 26 istringstream stream(line); //行の文字列をカンマで分割 27 28 while (getline(stream, token, ',')) { 29 if (cur_col == col) { //指定されたセルが見つかった 30 return token; //セルの値を返す 31 } 32 else { 33 } 34 ++cur_col; //次のセルへ 35 } 36 return nullopt; 37} 38 39/** 40*csvファイルから指定したセルの値を取得する 41*@param filename csvファイルのファイル名 42*@param row 行番号 43*@aram col_name 列名 44*/ 45[[nodiscard]] vector<string> get_data() { 46 vector<string> cellData; 47 string filename("C:/Users/AIM-CAE-PC12/Documents/Unreal Projects/Arduino_test/csvSearch_test.csv"); 48 ifstream fin(filename); //ファイルを開く 49 int col = 2; //列名に"値R"の列番号を取得 50 //string line = get_row(fin, row); //csvファイルの指定された行の文字列を取得 51 52 int cur_row = 1; //読み込んだ行数。先頭行は読み込み済みだから「1」を初期値に指定 53 string line; //ファイルの行を格納する変数 54 55 while (getline(fin, line)) { //ファイルを1行ずつ読み込む 56 57 if (optional<string> cell = get_cell(line, col)) { 58 cellData.push_back(*cell); 59 } 60 61 ++cur_row; 62 } 63 return cellData; //行の文字列からセルの値を取得 64} 65 66int main() 67{ 68 vector<string> csvData; 69 70 csvData = get_data(); 71 72 for (size_t z = 0; z < csvData.size(); ++z) { 73 cout << csvData[z] << endl; //値が入っているか確認用 74 } 75}
試したこと
①get_data()、get_cell()をstring<vector>に、get_cell()内のstring tokenもstring<vector>に変更し、データ型を合わせようとしましたが、get_cell()内のgetline(stream, token, ',')で以下の★エラー文と int main内のwhile (get_data(i) == "")で △エラー文がでてしまいます。
②string → vector<string>へ型変換できないかも調べましたが、発見することができませんでした。
①のエラー文
★オーバーロードされた関数 "getline" のインスタンスが引数リストと一致しません △これらのオペランドと一致する演算子 "==" はありません
補足情報(FW/ツールのバージョンなど)
Visual Studio 2022
打開策がないかインターネットで調べてみましたが、いまだ発見できずにいます。
正直なところ、プログラミングの知識・技術もまだまだ未熟ですので、丁寧なご説明も打いただけると大変ありがたいです。
何か不明点あればご質問ください。
お手数ですが、よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー