diff --git a/include/updater/csv_file_parser.hpp b/include/updater/csv_file_parser.hpp index 685c30553..b2b1a3d23 100644 --- a/include/updater/csv_file_parser.hpp +++ b/include/updater/csv_file_parser.hpp @@ -11,6 +11,7 @@ #include #include +#include #include #include #include @@ -93,8 +94,12 @@ template struct CSVFilesParser // Parse a single CSV file and return result as a vector auto ParseCSVFile(const std::string &filename, std::size_t file_id) const { + std::vector> result; try { + if (boost::filesystem::file_size(filename) == 0) + return result; + boost::iostreams::mapped_file_source mmap(filename); auto first = mmap.begin(), last = mmap.end(); @@ -103,7 +108,6 @@ template struct CSVFilesParser value_rule[qi::_val = qi::_1, boost::phoenix::bind(&Value::source, qi::_val) = file_id]; qi::rule()> csv_line = (key_rule >> ',' >> value_source) >> -(',' >> *(qi::char_ - qi::eol)); - std::vector> result; const auto ok = qi::parse(first, last, -(csv_line % qi::eol) >> *qi::eol, result); if (!ok || first != last) @@ -112,7 +116,7 @@ template struct CSVFilesParser while (begin_of_line >= mmap.begin() && *begin_of_line != '\n') --begin_of_line; auto line_number = std::count(mmap.begin(), first, '\n') + 1; - const auto message = boost::format("CSV file %1% malformed on line %2%: %3%") % + const auto message = boost::format("CSV file %1% malformed on line %2%:\n %3%\n") % filename % std::to_string(line_number) % std::string(begin_of_line + 1, std::find(first, last, '\n')); throw util::exception(message.str() + SOURCE_REF);