Files
ar_basalt/thirdparty/Pangolin/tools/Plotter/csv_data_loader.h
2022-04-05 11:42:28 +03:00

88 lines
2.1 KiB
C++

#pragma once
#include <pangolin/platform.h>
#include <vector>
#include <string>
#include <fstream>
#include <memory>
class CsvDataLoader
{
public:
CsvDataLoader(const std::vector<std::string>& csv_files, char delim = ',')
: delim(delim)
{
for(const auto& f : csv_files) {
if(f == "-") {
streams.push_back(&std::cin);
}else{
std::ifstream* pFile = new std::ifstream(f);
owned_streams.emplace_back(pFile);
streams.push_back(pFile);
PANGO_ASSERT(pFile->is_open());
}
}
}
bool SkipStreamRows(const std::vector<size_t>& rows_to_skip)
{
if(rows_to_skip.size()) {
PANGO_ASSERT(rows_to_skip.size() == streams.size());
std::vector<std::string> dummy_row;
for(size_t i=0; i < streams.size(); ++i) {
for(size_t r=0; r < rows_to_skip[i]; ++r) {
if(!AppendColumns(dummy_row, *streams[i], delim)) {
return false;
}
}
}
}
return true;
}
bool ReadRow(std::vector<std::string>& row)
{
row.clear();
for(auto& s : streams) {
if(!AppendColumns(row, *s, delim)) {
return false;
}
}
return true;
}
private:
static bool AppendColumns(std::vector<std::string>& cols, std::istream& s, char delim)
{
// Read line from stream
std::string row;
std::getline(s,row);
// Failure if no lines to read
if(!s.good()) return false;
std::stringstream row_stream(row);
std::string cell;
// Read cells
while(std::getline(row_stream, cell, delim)) {
cols.push_back(cell);
}
// Check for an empty trailing cell
if (!row_stream && cell.empty()) {
cols.push_back("");
}
return true;
}
char delim;
std::vector<std::istream*> streams;
std::vector<std::unique_ptr<std::istream>> owned_streams;
};