From 101cf24a36df2c2cc6329d3183558ee88c4c6111 Mon Sep 17 00:00:00 2001 From: blueloveTH Date: Wed, 29 Nov 2023 11:10:37 +0800 Subject: [PATCH] csv support linebreaks --- src/csv.cpp | 13 +++++++++++-- tests/80_csv.py | 8 ++++++++ 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/src/csv.cpp b/src/csv.cpp index 6c53f0bc..c2542a3a 100644 --- a/src/csv.cpp +++ b/src/csv.cpp @@ -16,9 +16,11 @@ void add_module_csv(VM *vm){ if (strncmp(line.data(), "\xEF\xBB\xBF", 3) == 0) line = line.substr(3); } List row; - int j = 0; + int j; bool in_quote = false; std::string buffer; +__NEXT_LINE: + j = 0; while(j < line.size()){ switch(line[j]){ case '"': @@ -50,7 +52,14 @@ void add_module_csv(VM *vm){ j++; } if(in_quote){ - vm->ValueError("unterminated quote"); + if(i == csvfile.size()-1){ + vm->ValueError("unterminated quote"); + }else{ + buffer += '\n'; + i++; + line = CAST(Str&, csvfile[i]).sv(); + goto __NEXT_LINE; + } } row.push_back(VAR(buffer)); ret.push_back(VAR(std::move(row))); diff --git a/tests/80_csv.py b/tests/80_csv.py index e0483986..7e13ba29 100644 --- a/tests/80_csv.py +++ b/tests/80_csv.py @@ -31,6 +31,14 @@ test("""a,b ,c, 1,"22""33",3 """, [['a', 'b ', 'c', ''], ['1', '22"33', '3']]) +# newline +test('''a,b,c +1,2,"3, + 4" +5,"a,"" +b",7 +''', [['a', 'b', 'c'], ['1', '2', '3,\n 4'], ['5', 'a,"\nb', '7']]) + ret = csv.DictReader("""a,b,c 1,2,3 "4",5,6