Skip to content

Commit 1eae9f5

Browse files
committed
Language/CSV/Mapping: CRLF support
1 parent 90ad62c commit 1eae9f5

3 files changed

Lines changed: 36 additions & 20 deletions

File tree

modules/Language/CSV/Mapping.mpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,12 @@ export namespace CppUtils::Language::CSV
6363
{
6464
const auto lines = csv
6565
| std::views::split(lineSeparator)
66-
| std::views::transform([](auto&& range) { return std::string_view{range}; })
66+
| std::views::transform([&](auto&& range) {
67+
auto line = std::string_view{range};
68+
if (lineSeparator == "\n" and not std::empty(line) and line.back() == '\r')
69+
line.remove_suffix(1);
70+
return line;
71+
})
6772
| std::ranges::to<std::vector<std::string_view>>();
6873
for (auto i = dropNFirstLines; i < std::size(lines); ++i)
6974
if (const auto trimmedLine = String::trimString(lines[i]); not std::empty(trimmedLine))

tests/Language/CSV/Mapping.mpp

Lines changed: 17 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -29,22 +29,22 @@ namespace CppUtils::UnitTest::Language::CSV::Mapping
2929
using namespace CppUtils::String::Literals;
3030

3131
using CSVMapping = CppUtils::Type::Mapping<
32-
CppUtils::Type::Pair<"String view"_token, "A"_excelColumn>,
33-
CppUtils::Type::Pair<"String"_token, "B"_excelColumn>,
32+
CppUtils::Type::Pair<"String 1"_token, "A"_excelColumn>,
33+
CppUtils::Type::Pair<"String 2"_token, "B"_excelColumn>,
3434
CppUtils::Type::Pair<"Unsigned integer"_token, "C"_excelColumn>,
3535
CppUtils::Type::Pair<"Signed integer"_token, "D"_excelColumn>,
3636
CppUtils::Type::Pair<"Floating point"_token, "E"_excelColumn>>;
3737

3838
using StructMapping = CppUtils::Type::Mapping<
39-
CppUtils::Type::Pair<"String view"_token, &Object::a>,
40-
CppUtils::Type::Pair<"String"_token, &Object::b>,
39+
CppUtils::Type::Pair<"String 1"_token, &Object::a>,
40+
CppUtils::Type::Pair<"String 2"_token, &Object::b>,
4141
CppUtils::Type::Pair<"Unsigned integer"_token, &Object::c>,
4242
CppUtils::Type::Pair<"Signed integer"_token, &Object::d>,
4343
CppUtils::Type::Pair<"Floating point"_token, &Object::e>>;
4444

4545
using FileStructMapping = CppUtils::Type::Mapping<
46-
CppUtils::Type::Pair<"String view"_token, &FileObject::a>,
47-
CppUtils::Type::Pair<"String"_token, &FileObject::b>,
46+
CppUtils::Type::Pair<"String 1"_token, &FileObject::a>,
47+
CppUtils::Type::Pair<"String 2"_token, &FileObject::b>,
4848
CppUtils::Type::Pair<"Unsigned integer"_token, &FileObject::c>,
4949
CppUtils::Type::Pair<"Signed integer"_token, &FileObject::d>,
5050
CppUtils::Type::Pair<"Floating point"_token, &FileObject::e>>;
@@ -133,6 +133,17 @@ namespace CppUtils::UnitTest::Language::CSV::Mapping
133133
}};
134134
});
135135

136+
suite.addTest("load CSV File with CRLF", [&] {
137+
CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) {
138+
const auto filePath = directory / "test_crlf.csv";
139+
CppUtils::FileSystem::String::write(filePath, "a;b;c;d;e\r\nfoo;bar;42;-1;3.14\r\n"sv);
140+
141+
const auto objects = CppUtils::Language::CSV::loadFile<FileObject, FileObjectMapping>(filePath, ";", "\n", 1uz);
142+
143+
suite.expectEqual(objects, std::vector<FileObject>{{"foo", "bar", 42, -1, 3.14f}});
144+
}};
145+
});
146+
136147
suite.addTest("load CSV Directory", [&] {
137148
CppUtils::FileSystem::TemporaryDirectory{[&suite](const auto& directory) {
138149
CppUtils::FileSystem::String::write(directory / "test1.csv", "a;b;c;d;e\nfoo;bar;1;-10;1.1\n"sv);

tests/Type/Mapping.mpp

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@ namespace CppUtils::UnitTest::Type::Mapping
66
{
77
namespace Map
88
{
9-
using Map = ::CppUtils::Type::Mapping<
10-
::CppUtils::Type::Pair<0, 100>,
11-
::CppUtils::Type::Pair<1, 200>,
12-
::CppUtils::Type::Pair<2, 300>>;
9+
using Map = CppUtils::Type::Mapping<
10+
CppUtils::Type::Pair<0, 100>,
11+
CppUtils::Type::Pair<1, 200>,
12+
CppUtils::Type::Pair<2, 300>>;
1313

1414
static_assert(std::get<0>(Map::toRhs<0>()) == 100);
1515
static_assert(std::get<0>(Map::toRhs<1>()) == 200);
@@ -30,8 +30,8 @@ namespace CppUtils::UnitTest::Type::Mapping
3030

3131
namespace MultiMap
3232
{
33-
using MultiMap = ::CppUtils::Type::Mapping<
34-
::CppUtils::Type::Pair<0, 1, 2, 3>>;
33+
using MultiMap = CppUtils::Type::Mapping<
34+
CppUtils::Type::Pair<0, 1, 2, 3>>;
3535

3636
static_assert(std::tuple_size_v<decltype(MultiMap::toRhs<0>())> == 3);
3737
static_assert(std::get<0>(MultiMap::toRhs<0>()) == 1);
@@ -49,9 +49,9 @@ namespace CppUtils::UnitTest::Type::Mapping
4949

5050
namespace Boolean
5151
{
52-
using BooleanMap = ::CppUtils::Type::Mapping<
53-
::CppUtils::Type::Pair<0, true>,
54-
::CppUtils::Type::Pair<1, false>>;
52+
using BooleanMap = CppUtils::Type::Mapping<
53+
CppUtils::Type::Pair<0, true>,
54+
CppUtils::Type::Pair<1, false>>;
5555

5656
static_assert(BooleanMap::toSingleRhs<0>());
5757
static_assert(not BooleanMap::toSingleRhs<1>());
@@ -68,8 +68,8 @@ namespace CppUtils::UnitTest::Type::Mapping
6868
return x * 2;
6969
}
7070

71-
using FunctionMap = ::CppUtils::Type::Mapping<
72-
::CppUtils::Type::Pair<0, &function>>;
71+
using FunctionMap = CppUtils::Type::Mapping<
72+
CppUtils::Type::Pair<0, &function>>;
7373

7474
static_assert(FunctionMap::toSingleRhs<0>() == &function);
7575

@@ -83,8 +83,8 @@ namespace CppUtils::UnitTest::Type::Mapping
8383
int value;
8484
};
8585

86-
using MemberMap = ::CppUtils::Type::Mapping<
87-
::CppUtils::Type::Pair<0, &Struct::value>>;
86+
using MemberMap = CppUtils::Type::Mapping<
87+
CppUtils::Type::Pair<0, &Struct::value>>;
8888

8989
static_assert(MemberMap::toSingleRhs<0>() == &Struct::value);
9090

0 commit comments

Comments
 (0)