blueloveTH 2 лет назад
Родитель
Сommit
101cf24a36
2 измененных файлов с 19 добавлено и 2 удалено
  1. 11 2
      src/csv.cpp
  2. 8 0
      tests/80_csv.py

+ 11 - 2
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)));

+ 8 - 0
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