extras/CSVParser: support for double double-quote for 'escaped' quotes within quotes
authorJerome St-Louis <jerome@ecere.com>
Fri, 19 Sep 2014 22:18:57 +0000 (18:18 -0400)
committerJerome St-Louis <jerome@ecere.com>
Wed, 9 Dec 2015 23:11:34 +0000 (18:11 -0500)
- LibreOffice seems to export to CSV this way

extras/CSVParser.ec

index 87f9db3..06b54f5 100644 (file)
@@ -138,8 +138,13 @@ public:
 
                if(!inTextQuote && !escaped && ch == options.valueQuotes)
                {
-                  quoted = false;
-                  end = c;
+                  if(buffer[c+1] == options.valueQuotes)
+                     c++;
+                  else
+                  {
+                     quoted = false;
+                     end = c;
+                  }
                }
                if(options.escaped && ch == '\\')
                   escaped = true;
@@ -162,12 +167,19 @@ public:
                   {
                      int len = started ? (end-start) : 0;
                      String value = new char[len+1];
-                     if(options.escaped)
+                     if(options.escaped)  // Escaped with a backslash
                         UnescapeString(value, &buffer[start], len);
                      else
                      {
+                        String dq;
                         memcpy(value, &buffer[start], len);
                         value[len] = 0;
+                        while((dq = strstr(value, "\"\"")))
+                        {
+                           memmove(dq + 1, dq + 2, len - (uint)(dq + 2 - value) + 1);
+                           len--;
+                           value[len] = 0;
+                        }
                      }
                      values.Add(value);
                   }
@@ -209,8 +221,15 @@ public:
             UnescapeString(value, &buffer[start], len);
          else
          {
+            String dq;
             memcpy(value, &buffer[start], len);
             value[len] = 0;
+            while((dq = strstr(value, "\"\"")))
+            {
+               memmove(dq + 1, dq + 2, len - (uint)(dq + 2 - value) + 1);
+               len--;
+               value[len] = 0;
+            }
          }
          values.Add(value);
       }