Skip to content

Commit 2c3b665

Browse files
authored
Merge pull request #205 from MarkLee131/fix/autoquote-missing-quotechar-check
fixes auto-quote not quoting cells containing quote characters
2 parents 3aa768a + b8a762e commit 2c3b665

3 files changed

Lines changed: 83 additions & 0 deletions

File tree

CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,7 @@ if(RAPIDCSV_BUILD_TESTS)
193193
endif()
194194
add_unit_test(test102)
195195
add_unit_test(test103)
196+
add_unit_test(test104)
196197

197198
# perf tests
198199
add_perf_test(ptest001)

src/rapidcsv.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1820,6 +1820,7 @@ namespace rapidcsv
18201820
{
18211821
if (mSeparatorParams.mAutoQuote &&
18221822
((itc->find(mSeparatorParams.mSeparator) != std::string::npos) ||
1823+
(itc->find(mSeparatorParams.mQuoteChar) != std::string::npos) ||
18231824
(itc->find(' ') != std::string::npos) ||
18241825
(itc->find('\n') != std::string::npos)))
18251826
{

tests/test104.cpp

Lines changed: 81 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,81 @@
1+
// test104.cpp - write round-trip with cells containing quote characters
2+
3+
#include <rapidcsv.h>
4+
#include "unittest.h"
5+
6+
int main()
7+
{
8+
int rv = 0;
9+
10+
try
11+
{
12+
// Test 1: Cell containing quote character but no separator/space/newline
13+
{
14+
std::string path = unittest::TempPath();
15+
std::string csv =
16+
"a,b,c\n"
17+
"1,he said \"hello\",3\n"
18+
"4,5,6\n"
19+
;
20+
unittest::WriteFile(path, csv);
21+
22+
rapidcsv::Document doc1(path, rapidcsv::LabelParams(-1, -1));
23+
unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(1, 1),
24+
"he said \"hello\"");
25+
26+
// Save and reload - data must survive round-trip
27+
doc1.Save(path);
28+
rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, -1));
29+
30+
unittest::ExpectEqual(size_t, doc2.GetRowCount(), size_t(3));
31+
unittest::ExpectEqual(size_t, doc2.GetColumnCount(), size_t(3));
32+
unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(1, 1),
33+
"he said \"hello\"");
34+
35+
unittest::DeleteFile(path);
36+
}
37+
38+
// Test 2: Cell containing only a quote character
39+
{
40+
std::string path = unittest::TempPath();
41+
42+
std::istringstream ss("a,b\nx,\"y\"\n");
43+
rapidcsv::Document doc1(ss, rapidcsv::LabelParams(-1, -1));
44+
doc1.SetCell<std::string>(1, 0, "\"");
45+
doc1.Save(path);
46+
47+
rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, -1));
48+
unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(1, 0), "\"");
49+
50+
unittest::DeleteFile(path);
51+
}
52+
53+
// Test 3: Empty quoted cells round-trip
54+
{
55+
std::string path = unittest::TempPath();
56+
std::string csv = "\"\",\"\",\"\"\n";
57+
unittest::WriteFile(path, csv);
58+
59+
rapidcsv::Document doc1(path, rapidcsv::LabelParams(-1, -1));
60+
unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(0, 0), "");
61+
unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(1, 0), "");
62+
unittest::ExpectEqual(std::string, doc1.GetCell<std::string>(2, 0), "");
63+
64+
doc1.Save(path);
65+
rapidcsv::Document doc2(path, rapidcsv::LabelParams(-1, -1));
66+
unittest::ExpectEqual(size_t, doc2.GetColumnCount(), size_t(3));
67+
unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(0, 0), "");
68+
unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(1, 0), "");
69+
unittest::ExpectEqual(std::string, doc2.GetCell<std::string>(2, 0), "");
70+
71+
unittest::DeleteFile(path);
72+
}
73+
}
74+
catch (const std::exception& ex)
75+
{
76+
std::cout << ex.what() << std::endl;
77+
rv = 1;
78+
}
79+
80+
return rv;
81+
}

0 commit comments

Comments
 (0)