From e0483d6926d677090fca6b2f7555f4ba6a020bf9 Mon Sep 17 00:00:00 2001 From: Jerome St-Louis Date: Fri, 19 Sep 2014 18:18:57 -0400 Subject: [PATCH] extras/CSVParser: support for double double-quote for 'escaped' quotes within quotes - LibreOffice seems to export to CSV this way --- extras/CSVParser.ec | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/extras/CSVParser.ec b/extras/CSVParser.ec index 87f9db3..06b54f5 100644 --- a/extras/CSVParser.ec +++ b/extras/CSVParser.ec @@ -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); } -- 1.8.3.1