回答編集履歴

5

修正

2020/09/05 13:02

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -128,6 +128,8 @@
128
128
 
129
129
  std::cout << "Error: " << e.what() << std::endl;
130
130
 
131
+ return 1;
132
+
131
133
  }
132
134
 
133
135
 

4

修正

2020/09/05 13:01

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -78,11 +78,21 @@
78
78
 
79
79
  {
80
80
 
81
+ Mat mat;
82
+
83
+
84
+
81
85
  std::ifstream ifs(path);
82
86
 
87
+ if (!ifs) {
88
+
89
+ std::cout << "Failed to open csv path" << std::endl;
90
+
91
+ return mat;
92
+
93
+ }
94
+
83
95
  std::string line;
84
-
85
- Mat mat;
86
96
 
87
97
 
88
98
 
@@ -144,6 +154,4 @@
144
154
 
145
155
  }
146
156
 
147
-
148
-
149
157
  ```

3

修正

2020/09/05 12:29

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -108,7 +108,17 @@
108
108
 
109
109
  {
110
110
 
111
+ Mat mat;
112
+
113
+ try {
114
+
111
- Mat mat = parse_csv("sample.csv");
115
+ mat = parse_csv("sample.csv");
116
+
117
+ } catch (std::exception &e) {
118
+
119
+ std::cout << "Error: " << e.what() << std::endl;
120
+
121
+ }
112
122
 
113
123
 
114
124
 
@@ -134,4 +144,6 @@
134
144
 
135
145
  }
136
146
 
147
+
148
+
137
149
  ```

2

修正

2020/09/05 12:26

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -17,6 +17,10 @@
17
17
  #include <string>
18
18
 
19
19
  #include <vector>
20
+
21
+
22
+
23
+ using Mat = std::vector<std::vector<double>>;
20
24
 
21
25
 
22
26
 
@@ -58,15 +62,27 @@
58
62
 
59
63
 
60
64
 
65
+ /**
66
+
67
+ * @brief CSV を解析する。
68
+
69
+ *
70
+
71
+ * @param path CSV ファイルのパス
72
+
61
- int main(int, char **)
73
+ * @return Mat 行列
74
+
75
+ */
76
+
77
+ Mat parse_csv(const std::string &path)
62
78
 
63
79
  {
64
80
 
65
- std::ifstream ifs("sample.csv");
81
+ std::ifstream ifs(path);
66
82
 
67
83
  std::string line;
68
84
 
69
- std::vector<std::vector<double>> mat;
85
+ Mat mat;
70
86
 
71
87
 
72
88
 
@@ -79,6 +95,20 @@
79
95
  mat.push_back(values);
80
96
 
81
97
  }
98
+
99
+
100
+
101
+ return mat;
102
+
103
+ }
104
+
105
+
106
+
107
+ int main(int, char **)
108
+
109
+ {
110
+
111
+ Mat mat = parse_csv("sample.csv");
82
112
 
83
113
 
84
114
 

1

修正

2020/09/05 12:23

投稿

tiitoi
tiitoi

スコア21956

test CHANGED
@@ -1,4 +1,4 @@
1
- `std::getline()` のオーバーロード関数に区切り文字ごとに分解ものがあるので、それを使ったほうが楽なのではないでしょうか。
1
+ `std::getline()` のオーバーロード関数に区切り文字読み込めバージョンがあるので、それを使ったほうがカンマ区切りの文字列を解析するのが楽なのではないでしょうか。
2
2
 
3
3
 
4
4
 
@@ -20,17 +20,31 @@
20
20
 
21
21
 
22
22
 
23
+ /**
24
+
25
+ * @brief 1行分パースする。
26
+
27
+ *
28
+
29
+ * @param line 行
30
+
31
+ * @param delim 区切り文字
32
+
33
+ * @return std::vector<double> 値の一覧
34
+
35
+ */
36
+
23
37
  std::vector<double> parse_line(const std::string &line, char delim = ',')
24
38
 
25
39
  {
26
40
 
27
41
  std::vector<double> values;
28
42
 
43
+
44
+
29
45
  std::istringstream ss(line);
30
46
 
31
47
  std::string token;
32
-
33
-
34
48
 
35
49
  while (std::getline(ss, token, delim))
36
50
 
@@ -88,12 +102,6 @@
88
102
 
89
103
  }
90
104
 
91
-
92
-
93
- return 0;
94
-
95
105
  }
96
106
 
97
-
98
-
99
107
  ```