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 <[email protected]> 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,\"\\'\"")); } }
