#ifndef GUARD_CSVFILE_H #define GUARD_CSVFILE_H #include "global.h" #include class CsvFile { std::vector _colnames; std::vector> _rows; size_t _nrow = 0; size_t _ncol = 0; bool _has_header = true; static void ParseRow(std::string &line, std::vector &row, bool resize = true); static void WriteRow(std::ofstream &ofile, std::vector const &row); public: CsvFile() = default; explicit CsvFile(const fs::path & filename, bool has_header = true) { FromFile(filename, has_header); }; void FromFile(const fs::path & filename, bool has_header = true); void ToFile(const fs::path & filename, bool write_header = true); bool GetRow(size_t i, std::vector &row) const; bool GetCol(size_t i, std::vector &col) const; bool GetCol(const std::string &name, std::vector &col) const; bool GetCell(size_t row, size_t col, std::string &cell) const; bool GetCell(const std::string &colname, size_t row, std::string &cell) const; bool SetRow(size_t i, const std::vector &row); bool SetCol(size_t i, const std::vector &col); bool SetCol(const std::string &name, const std::vector &col); bool SetCell(size_t row, size_t col, const std::string &cell); bool SetCell(const std::string &colname, size_t row, const std::string &cell); std::vector>::iterator begin() { return _rows.begin(); } std::vector>::iterator end() { return _rows.end(); } std::vector>::const_iterator cbegin() { return _rows.cbegin(); } std::vector>::const_iterator cend() { return _rows.cend(); } std::vector>::reverse_iterator rbegin() { return _rows.rbegin(); } std::vector>::reverse_iterator rend() { return _rows.rend(); } std::vector>::const_reverse_iterator crbegin() { return _rows.crbegin(); } std::vector>::const_reverse_iterator crend() { return _rows.crend(); } [[nodiscard]] size_t nrow() const { return _nrow; } [[nodiscard]] size_t ncol() const { return _ncol; } std::vector &operator[](size_t i) { return _rows[i]; } void resize_internal() { _rows.resize(_nrow); for (auto & row : _rows) { row.resize(_ncol); } } void resize(size_t nrow, size_t ncol) { if (_nrow != nrow || _ncol != ncol) { _nrow = nrow; _ncol = ncol; resize_internal(); } } template void SetColnames(Iter _begin, Iter _end) { _colnames.assign(_begin, _end); if (_ncol != _colnames.size()) { _ncol = _colnames.size(); resize_internal(); } } std::vector &GetColnames() { return _colnames; } }; #endif //GUARD_CSVFILE_H