🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

2回答

2122閲覧

csvの数値をベクトルへ

sekiguchi.m

総合スコア15

CSV

CSV(Comma-Separated Values)はコンマで区切られた明白なテキスト値のリストです。もしくは、そのフォーマットでひとつ以上のリストを含むファイルを指します。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2019/11/17 12:13

前提・実現したいこと

csvに入力した数値をdouble型のベクトルへ読み込ませたいです。以下、csvの内容です。(tab区切り)
0.0 0.1 0.2 0.3
1.0 1.1 1.2 1.3

発生している問題・エラーメッセージ

1.0が読み込まれないです。スキップされてそうです。

vector[0][0] = 0 vector[0][1] = 0.1 vector[0][2] = 0.2 vector[0][3] = 0.3 vector[1][0] = 1.1 vector[1][1] = 1.2 vector[1][2] = 1.3 続行するには何かキーを押してください . . .

該当のソースコード

c++

#include <iostream> #include <fstream> #include <vector> #include <string> #include "read_csv.h" using namespace std; int main() { string line; ifstream ifs("../test1.csv"); vector<vector<double> > dbl{ {0.0},{0.0} }; int counter = 0; int column = 0; int row = 0; while (getline(ifs, line,'\t')){ int ex_enter = 0; if (column == 0) { dbl[row][column] = stod(line); column++; } else { dbl[row].resize(column + 1); dbl[row][column] = stod(line); ex_enter = line.find('\n'); if (ex_enter > 0) { //改行のときは>0の値になる row++; column = 0; dbl.resize(row + 1); } else { column++; } } /*++counter;          counterで処理のループを調べたが7になっていた cout << counter << endl;*/ } print_vector(dbl); //ベクトルを出力する関数 return 0; }

試したこと

ループ回数を調べたりしました。
どうぞよろしくお願いいたします。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

ベストアンサー

こんにちは。

最初の行の 0.2 まで呼んだ後に getline(ifs, line,'\t') を行うと、lineには"0.3\n1.0"が読まれてしまいます。stod()で \n後の1.0が変換されずにスキップされていると思います。

投稿2019/11/17 13:19

Chironian

総合スコア23272

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sekiguchi.m

2019/11/17 13:52

こんにちは ご回答ありがとうございます。つまり区切り文字を複数指定する必要があるという理解でよろしいでしょうか。
Chironian

2019/11/17 14:46

たいへん残念なのですがgetlineは区切り文字を複数指定できないです。 なので、この場合はgetlineを複数回使うのが良いと思います。
guest

0

C++

1#include <iostream> // cout, endl 2#include <fstream> // ifstream 3#include <sstream> // istringstream 4#include <vector> 5#include <string> 6using namespace std; 7 8void print_vector(const vector<vector<double>>& a) 9{ 10 for (int i = 0; i < a.size(); i++) { 11 for (int j = 0; j < a[i].size(); j++) 12 cout << "vector[" << i << "][" << j << "] = " << a[i][j] << endl; 13 cout << endl; 14 } 15} 16 17int main() 18{ 19 ifstream ifs("../test1.csv"); 20 vector<vector<double>> dbl; 21 string line; 22 while (getline(ifs, line)) { 23 istringstream iss(line); 24 vector<double> vd; 25 double d; 26 while (iss >> d) vd.push_back(d); 27 dbl.push_back(move(vd)); 28 } 29 print_vector(dbl); 30}

dbl.size() が row で、dbl[0].size() が column です。

投稿2019/11/17 15:57

編集2019/11/17 16:05
kazuma-s

総合スコア8224

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問