18 std::ifstream in(fname.c_str());
22 ERR(
"CsvInterface::getColumnNames(): Could not open file {:s}.", fname);
23 return std::vector<std::string>();
26 if (!std::getline(in, line))
28 ERR(
"CsvInterface::getColumnNames(): Could not read line from file "
40 if (fields.size() < 2)
42 for (
char const d : {
'\t',
';',
','})
45 if (fields.size() > 1)
51 return {begin(fields), end(fields)};
55 std::vector<GeoLib::Point*>& points)
57 std::ifstream in(fname.c_str());
61 ERR(
"CsvInterface::readPoints(): Could not open file {:s}.", fname);
66 std::getline(in, line);
68 std::size_t line_count(0);
69 std::size_t error_count(0);
70 std::list<std::string>::const_iterator it;
71 while (std::getline(in, line))
76 if (fields.size() < 3)
78 ERR(
"Line {:d} contains not enough columns of data. Skipping "
87 std::array<double, 3> point{};
88 point[0] = std::stod(*it);
89 point[1] = std::stod(*(++it));
90 point[2] = std::stod(*(++it));
91 points.push_back(
new GeoLib::Point(point[0], point[1], point[2]));
93 catch (
const std::invalid_argument&)
95 ERR(
"Error converting data to coordinates in line {:d}.",
103 std::vector<GeoLib::Point*>& points,
104 std::string
const& x_column_name,
105 std::string
const& y_column_name,
106 std::string
const& z_column_name)
108 std::ifstream in(fname.c_str());
109 std::array<std::string, 3>
const column_names = {
110 {x_column_name, y_column_name, z_column_name}};
114 ERR(
"CsvInterface::readPoints(): Could not open file {:s}.", fname);
119 std::getline(in, line);
120 std::array<std::size_t, 3>
const column_idx = {
123 (z_column_name.empty())
127 for (std::size_t i = 0; i < 3; ++i)
129 if (column_idx[i] == std::numeric_limits<std::size_t>::max())
131 ERR(
"Column '{:s}' not found in file header.", column_names[i]);
136 return readPoints(in, delim, points, column_idx);
140 std::vector<GeoLib::Point*>& points,
141 std::size_t x_column_idx, std::size_t y_column_idx,
142 std::size_t z_column_idx)
144 std::ifstream in(fname.c_str());
148 ERR(
"CsvInterface::readPoints(): Could not open file {:s}.", fname);
152 if (z_column_idx == std::numeric_limits<std::size_t>::max())
154 z_column_idx = y_column_idx;
156 std::array<std::size_t, 3>
const column_idx = {
157 {x_column_idx, y_column_idx, z_column_idx}};
159 return readPoints(in, delim, points, column_idx);
163 std::vector<GeoLib::Point*>& points,
164 std::array<std::size_t, 3>
const& column_idx)
166 std::array<std::size_t, 3> order = {{0, 1, 2}};
167 std::sort(order.begin(), order.end(),
168 [&column_idx](std::size_t idx1, std::size_t idx2)
169 { return column_idx[idx1] < column_idx[idx2]; });
170 std::array<std::size_t, 3>
const column_advance = {
171 {column_idx[order[0]], column_idx[order[1]] - column_idx[order[0]],
172 column_idx[order[2]] - column_idx[order[1]]}};
175 std::size_t line_count(0);
176 std::size_t error_count(0);
177 std::list<std::string>::const_iterator it;
179 while (std::getline(in, line))
184 if (fields.size() < column_idx[order[2]] + 1)
186 ERR(
"Line {:d} contains not enough columns of data. Skipping "
196 std::advance(it, column_advance[0]);
197 std::array<double, 3> point{};
198 point[order[0]] = std::stod(*it);
199 std::advance(it, column_advance[1]);
200 point[order[1]] = std::stod(*it);
201 std::advance(it, column_advance[2]);
203 (column_idx[1] == column_idx[2]) ? 0 : std::stod(*it);
204 points.push_back(
new GeoLib::Point(point[0], point[1], point[2]));
206 catch (
const std::invalid_argument&)
208 ERR(
"Error converting data to coordinates in line {:d}.",