You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@iotdb.apache.org by ch...@apache.org on 2021/06/08 07:53:06 UTC

[iotdb] branch revert_not_ready_fix_csv_pr created (now f56ad57)

This is an automated email from the ASF dual-hosted git repository.

chaow pushed a change to branch revert_not_ready_fix_csv_pr
in repository https://gitbox.apache.org/repos/asf/iotdb.git.


      at f56ad57  Revert "fix import csv split by comma bug (#3253)"

This branch includes the following new commits:

     new f56ad57  Revert "fix import csv split by comma bug (#3253)"

The 1 revisions listed above as "new" are entirely new to this
repository and will be described in separate emails.  The revisions
listed as "add" were already present in the repository and have only
been added to this reference.


[iotdb] 01/01: Revert "fix import csv split by comma bug (#3253)"

Posted by ch...@apache.org.
This is an automated email from the ASF dual-hosted git repository.

chaow pushed a commit to branch revert_not_ready_fix_csv_pr
in repository https://gitbox.apache.org/repos/asf/iotdb.git

commit f56ad572887f9fb6c52079166ac2ad69b985811a
Author: chaow <94...@qq.com>
AuthorDate: Tue Jun 8 15:31:49 2021 +0800

    Revert "fix import csv split by comma bug (#3253)"
    
    This reverts commit 5ea3c2e52ade6658621d798a131367bcdf438406.
---
 .../main/java/org/apache/iotdb/tool/ImportCsv.java | 41 +++++++++++++++-------
 .../org/apache/iotdb/tool/CsvLineSplitTest.java    | 11 ++----
 2 files changed, 31 insertions(+), 21 deletions(-)

diff --git a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
index a3179d3..6959360 100644
--- a/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
+++ b/cli/src/main/java/org/apache/iotdb/tool/ImportCsv.java
@@ -424,21 +424,38 @@ public class ImportCsv extends AbstractCsvTool {
 
   public static String[] splitCsvLine(String path) {
     List<String> nodes = new ArrayList<>();
-    int start = 0;
-    boolean singleQuotes = false;
-    boolean doubleQuotes = false;
-    // split by comma if the comma is followed by an even number of quotes
-    for (int i = 0; i < path.length(); i++) {
-      if (path.charAt(i) == '\"') {
-        doubleQuotes = !doubleQuotes; // toggle state
+    startIndex = 0;
+    for (i = 0; i < path.length(); i++) {
+      if (path.charAt(i) == ',') {
+        nodes.add(path.substring(startIndex, i));
+        startIndex = i + 1;
+      } else if (path.charAt(i) == '"') {
+        nextNode(path, nodes, '"');
       } else if (path.charAt(i) == '\'') {
-        singleQuotes = !singleQuotes;
-      } else if (path.charAt(i) == ',' && (!singleQuotes && !doubleQuotes)) {
-        nodes.add(path.substring(start, i));
-        start = i + 1;
+        nextNode(path, nodes, '\'');
       }
     }
-    nodes.add(path.substring(start));
+    if (path.charAt(path.length() - 1) == ',') {
+      nodes.add("");
+    }
+    if (startIndex <= path.length() - 1) {
+      nodes.add(path.substring(startIndex));
+    }
     return nodes.toArray(new String[0]);
   }
+
+  public static void nextNode(String path, List<String> nodes, char enclose) {
+    int endIndex = path.indexOf(enclose, i + 1);
+    // if a double quotes with escape character
+    while (endIndex != -1 && path.charAt(endIndex - 1) == '\\') {
+      endIndex = path.indexOf(enclose, endIndex + 1);
+    }
+    if (endIndex != -1 && (endIndex == path.length() - 1 || path.charAt(endIndex + 1) == ',')) {
+      nodes.add(path.substring(startIndex + 1, endIndex));
+      i = endIndex + 1;
+      startIndex = endIndex + 2;
+    } else {
+      throw new IllegalArgumentException("Illegal csv line" + path);
+    }
+  }
 }
diff --git a/cli/src/test/java/org/apache/iotdb/tool/CsvLineSplitTest.java b/cli/src/test/java/org/apache/iotdb/tool/CsvLineSplitTest.java
index 2b54434..fd1c9ba 100644
--- a/cli/src/test/java/org/apache/iotdb/tool/CsvLineSplitTest.java
+++ b/cli/src/test/java/org/apache/iotdb/tool/CsvLineSplitTest.java
@@ -26,15 +26,8 @@ public class CsvLineSplitTest {
   @Test
   public void testSplit() {
     Assert.assertArrayEquals(
-        new String[] {"", "a", "b", "c", "\\\""}, ImportCsv.splitCsvLine(",a,b,c,\\\""));
+        new String[] {"", "a", "b", "c", "\\\""}, ImportCsv.splitCsvLine(",a,b,c,\"\\\"\""));
     Assert.assertArrayEquals(
-        new String[] {"", "a", "b", "\\'"}, ImportCsv.splitCsvLine(",a,b,\\'"));
-    Assert.assertArrayEquals(
-        new String[] {"", "a\",\"a", "\"a,,\"", "'"}, ImportCsv.splitCsvLine(",a\",\"a,\"a,,\",'"));
-    Assert.assertArrayEquals(
-        new String[] {"True", "a=\",\"a''"}, ImportCsv.splitCsvLine("True,a=\",\"a''"));
-    Assert.assertArrayEquals(
-        new String[] {"True", "\"a=,,,a=z//z'a\""},
-        ImportCsv.splitCsvLine("True,\"a=,,,a=z//z'a\""));
+        new String[] {"", "a", "b", "\\'"}, ImportCsv.splitCsvLine(",a,b,\"\\'\""));
   }
 }