diff --git a/src/ObjCommon/Csv/CsvStream.cpp b/src/ObjCommon/Csv/CsvStream.cpp index 2b434db2..884c5e5d 100644 --- a/src/ObjCommon/Csv/CsvStream.cpp +++ b/src/ObjCommon/Csv/CsvStream.cpp @@ -1,5 +1,7 @@ #include "CsvStream.h" +#include "Utils/StringUtils.h" + #include #include @@ -110,13 +112,17 @@ bool CsvInputStream::EmitNextRow(const std::function& cb) con auto c = m_stream.get(); const auto isEof = c == EOF; std::ostringstream col; + auto content = false; while (c != EOF) { if (c == CSV_SEPARATOR) { - cb(col.str()); + auto value = col.str(); + utils::StringTrimR(value); + cb(std::move(value)); col.clear(); col.str(std::string()); + content = false; } else if (c == '\r') { @@ -129,8 +135,14 @@ bool CsvInputStream::EmitNextRow(const std::function& cb) con { break; } + else if (isspace(c)) + { + if (content) + col << static_cast(c); + } else { + content = true; col << static_cast(c); } @@ -139,7 +151,9 @@ bool CsvInputStream::EmitNextRow(const std::function& cb) con if (!isEof) { - cb(col.str()); + auto value = col.str(); + utils::StringTrimR(value); + cb(std::move(value)); } return !isEof; diff --git a/src/Utils/Utils/StringUtils.cpp b/src/Utils/Utils/StringUtils.cpp index d582fa1f..08e4f544 100644 --- a/src/Utils/Utils/StringUtils.cpp +++ b/src/Utils/Utils/StringUtils.cpp @@ -1,6 +1,7 @@ #include "StringUtils.h" -#include +#include +#include #include namespace utils @@ -102,13 +103,41 @@ namespace utils c = static_cast(toupper(static_cast(c))); } - std::vector StringSplit(const std::string& str, const char delim) + void StringTrimL(std::string& str) + { + str.erase(str.begin(), + std::ranges::find_if(str, + [](const unsigned char ch) + { + return !std::isspace(ch); + })); + } + + void StringTrimR(std::string& str) + { + str.erase(std::find_if(str.rbegin(), + str.rend(), + [](const unsigned char ch) + { + return !std::isspace(ch); + }) + .base(), + str.end()); + } + + void StringTrim(std::string& str) + { + StringTrimR(str); + StringTrimL(str); + } + + std::vector StringSplit(const std::string& str, const char delimiter) { std::vector strings; std::istringstream stream(str); std::string s; - while (std::getline(stream, s, delim)) + while (std::getline(stream, s, delimiter)) { strings.emplace_back(std::move(s)); } diff --git a/src/Utils/Utils/StringUtils.h b/src/Utils/Utils/StringUtils.h index 4104c4f1..38c7ba04 100644 --- a/src/Utils/Utils/StringUtils.h +++ b/src/Utils/Utils/StringUtils.h @@ -16,5 +16,9 @@ namespace utils void MakeStringLowerCase(std::string& str); void MakeStringUpperCase(std::string& str); - std::vector StringSplit(const std::string& str, const char delim); + void StringTrimL(std::string& str); + void StringTrimR(std::string& str); + void StringTrim(std::string& str); + + std::vector StringSplit(const std::string& str, char delimiter); } // namespace utils