our_knp/examples/knp/base-framework/impl/sonata/csv_content.cpp
int 8f43927575 Initial import: KNP experiments (examples, viz, cats-dogs, reports)
examples/ is based on KasperskyLab/knp at 55470ed6 with local changes
to the mnist-learn altai/blifat models, cuda-backend CMake and model_loader.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-10-14 18:17:15 +03:00

99 lines
3.1 KiB
C++

/**
* @file csv_content.cpp
* @brief CSV helper file.
* @kaspersky_support An. Vartenkov
* @date 22.03.2024
* @license Apache 2.0
* @copyright © 2024 AO Kaspersky Lab
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
#include "csv_content.h"
namespace knp::framework::sonata
{
CsvContent load_csv_content(const fs::path &csv_path)
{
if (!is_regular_file(csv_path)) throw std::runtime_error("\"" + csv_path.string() + "\" does not exist.");
csv2::Reader<
csv2::delimiter<' '>, csv2::quote_character<'"'>, csv2::first_row_is_header<true>,
csv2::trim_policy::trim_characters<'\r'>>
csv_reader;
csv_reader.mmap(csv_path.string());
const auto csv_header = csv_reader.header();
std::vector<std::string> header;
std::string buf;
for (const auto &header_cell : csv_header)
{
header_cell.read_value(buf);
header.emplace_back(std::move(buf));
}
CsvContent res;
res.set_header(header);
for (const auto &row : csv_reader)
{
std::vector<std::string> buf_vector;
buf_vector.reserve(header.size());
for (const auto &cell : row)
{
buf = "";
cell.read_value(buf);
buf_vector.push_back(buf);
}
// Making sure all vectors are at least required size.
for (size_t i = buf_vector.size(); i < header.size(); ++i) buf_vector.emplace_back("");
if (!buf_vector.empty() && !buf_vector[0].empty()) res.add_row(buf_vector);
}
return res;
}
void save_csv_content(const CsvContent &csv_data, const fs::path &csv_path)
{
auto header = csv_data.get_header();
auto rc_size = csv_data.get_rc_size();
std::vector<std::vector<std::string>> values;
values.reserve(rc_size.first);
for (size_t row = 0; row < rc_size.first; ++row)
{
std::vector<std::string> row_values;
row_values.reserve(rc_size.second);
std::transform(
header.begin(), header.end(), std::back_inserter(row_values),
[row, &csv_data](const std::string &col) { return csv_data.get_value<std::string>(row, col); });
values.push_back(row_values);
}
std::ofstream csv_file(csv_path);
csv2::Writer<csv2::delimiter<' '>> writer(csv_file);
writer.write_row(header);
writer.write_rows(values);
}
template <class V>
V CsvContent::get_value(size_t row, const std::string &col) const
{
return values_[row][header_index_.find(col)->second];
}
template <>
int CsvContent::get_value<int>(size_t row, const std::string &col) const
{
return std::stoi(values_[row][header_index_.find(col)->second]);
}
} // namespace knp::framework::sonata