41 static std::vector<std::string>
getColumnNames(std::string
const& fname,
55 std::vector<T>
const& vec)
58 std::is_same_v<T, std::string> || std::is_same_v<T, double> ||
59 std::is_same_v<T, int>,
60 "CsvInterface can only write vectors of strings, doubles or ints.");
65 if (vec_size != vec.size())
67 ERR(
"Vector size does not match existing data (should be "
80 bool write()
override;
91 static int readPoints(std::string
const& fname,
char delim,
92 std::vector<GeoLib::Point*>& points);
109 static int readPoints(std::string
const& fname,
char delim,
110 std::vector<GeoLib::Point*>& points,
111 std::string
const& x_column_name,
112 std::string
const& y_column_name,
113 std::string
const& z_column_name =
"");
130 std::string
const& fname,
char delim,
131 std::vector<GeoLib::Point*>& points, std::size_t x_column_idx,
132 std::size_t y_column_idx,
133 std::size_t z_column_idx = std::numeric_limits<std::size_t>::max());
144 template <
typename T>
146 std::string
const& fname,
char delim, std::string
const& column_name)
148 std::ifstream in(fname.c_str());
151 ERR(
"CsvInterface::readColumn(): Could not open file {:s}.", fname);
156 std::getline(in, line);
157 std::size_t
const column_idx =
159 if (column_idx == std::numeric_limits<std::size_t>::max())
161 ERR(
"Column '{:s}' not found in file header.", column_name);
167 template <
typename T>
168 static std::pair<int, std::vector<T>>
readColumn(std::string
const& fname,
170 std::size_t column_idx)
172 std::ifstream in(fname.c_str());
175 ERR(
"CsvInterface::readColumn(): Could not open file {:s}.", fname);
183 static int readPoints(std::ifstream& in,
char delim,
184 std::vector<GeoLib::Point*>& points,
185 std::array<std::size_t, 3>
const& column_idx);
188 template <
typename T>
189 static std::pair<int, std::vector<T>>
readColumn(std::ifstream& in,
191 std::size_t column_idx)
193 std::vector<T> data_array;
195 std::size_t line_count(0);
197 while (std::getline(in, line))
200 std::list<std::string>
const fields =
203 if (fields.size() < column_idx + 1)
205 ERR(
"Line {:d} contains not enough columns of data. Skipping "
211 auto it = fields.begin();
212 std::advance(it, column_idx);
214 std::istringstream stream(*it);
216 if (!(stream >> value))
218 ERR(
"Error reading value in line {:d}.", line_count);
223 data_array.push_back(value);
225 return {error_count, data_array};
230 static std::size_t
findColumn(std::string
const& line,
char delim,
231 std::string
const& column_name);
241 void writeValue(std::size_t vec_idx, std::size_t in_vec_idx);
void ERR(fmt::format_string< Args... > fmt, Args &&... args)
Base class which enables writing an object to string, stringstream or file.
std::vector< std::any > _data
void writeValue(std::size_t vec_idx, std::size_t in_vec_idx)
std::vector< std::string > _vec_names
static std::vector< std::string > getColumnNames(std::string const &fname, char delim)
static std::pair< int, std::vector< T > > readColumn(std::string const &fname, char delim, std::size_t column_idx)
bool addVectorForWriting(std::string const &vec_name, std::vector< T > const &vec)
void setCsvHeader(bool write_header)
Stores if the CSV file to be written should include a header or not.
static std::size_t findColumn(std::string const &line, char delim, std::string const &column_name)
void addIndexVectorForWriting(std::size_t s)
Adds an index vector of size s to the CSV file.
static std::pair< int, std::vector< T > > readColumn(std::ifstream &in, char delim, std::size_t column_idx)
Actual column reader for public methods.
std::size_t getVectorSize(std::size_t idx) const
Returns the size of the vector with the given index.
std::size_t getNArrays() const
Returns the number of vectors currently staged for writing.
CsvInterface()
Constructor (only needed for writing files)
bool write() override
Writes the CSV file.
static std::pair< int, std::vector< T > > readColumn(std::string const &fname, char delim, std::string const &column_name)
static int readPoints(std::string const &fname, char delim, std::vector< GeoLib::Point * > &points)
std::vector< std::string > splitString(std::string const &str)