This is an automated email from the ASF dual-hosted git repository.
lmccay pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/knox.git
The following commit(s) were added to refs/heads/master by this push:
new 9a7767a KNOX-2307 - CSVKnoxShellTableBuilder must support quoted
strings and embedded commas (#301)
9a7767a is described below
commit 9a7767a5e5dbe588e48087c24338b5ae98ff90f4
Author: lmccay <[email protected]>
AuthorDate: Wed Mar 25 20:24:36 2020 -0400
KNOX-2307 - CSVKnoxShellTableBuilder must support quoted strings and
embedded commas (#301)
Change-Id: I82e096d204accc0ba6a334b18d6287eb67adf74c
---
.../shell/table/CSVKnoxShellTableBuilder.java | 6 +++--
.../gateway/shell/table/KnoxShellTableTest.java | 27 ++++++++++++++++++++++
2 files changed, 31 insertions(+), 2 deletions(-)
diff --git
a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/CSVKnoxShellTableBuilder.java
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/CSVKnoxShellTableBuilder.java
index d3ceedc..b7c23aa 100644
---
a/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/CSVKnoxShellTableBuilder.java
+++
b/gateway-shell/src/main/java/org/apache/knox/gateway/shell/table/CSVKnoxShellTableBuilder.java
@@ -51,7 +51,8 @@ public class CSVKnoxShellTableBuilder extends
KnoxShellTableBuilder {
}
public KnoxShellTable string(String csvString) throws IOException {
- try (InputStream is = new
ByteArrayInputStream(csvString.getBytes(StandardCharsets.UTF_8)); Reader
stringStreamReader = new InputStreamReader(is, StandardCharsets.UTF_8);
+ try (InputStream is = new
ByteArrayInputStream(csvString.getBytes(StandardCharsets.UTF_8));
+ Reader stringStreamReader = new InputStreamReader(is,
StandardCharsets.UTF_8);
BufferedReader csvReader = new BufferedReader(stringStreamReader);) {
buildTableFromCSVReader(csvReader);
}
@@ -69,7 +70,8 @@ public class CSVKnoxShellTableBuilder extends
KnoxShellTableBuilder {
if (!addingHeaders) {
this.table.row();
}
- String[] data = row.split(",", -1);
+ // handle comma's within quoted string values for single col
+ String[] data = row.split(",(?=([^\"]*\"[^\"]*\")*[^\"]*$)", -1);
for (String value : data) {
if (addingHeaders) {
diff --git
a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
index ac2f802..5644924 100644
---
a/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
+++
b/gateway-shell/src/test/java/org/apache/knox/gateway/shell/table/KnoxShellTableTest.java
@@ -191,6 +191,33 @@ public class KnoxShellTableTest {
}
@Test
+ public void testCSVQuotedEmbeddedCommaStringToTable() throws IOException {
+ KnoxShellTable table = new KnoxShellTable();
+ table.title("From URL");
+
+ table.header("\"Column A, Column A1\"").header("Column B").header("Column
C");
+ table.row().value("123").value("456").value("344444444");
+ table.row().value("789").value("012").value("844444444");
+
+ String csv = table.toCSV();
+ try {
+ // write file to /tmp to read back in
+ FileUtils.writeStringToFile(new File("/tmp/testtable.csv"), csv,
StandardCharsets.UTF_8);
+
+ KnoxShellTable urlTable = KnoxShellTable.builder().csv()
+ .withHeaders()
+ .url("file:///tmp/testtable.csv");
+ urlTable.title("From URL");
+ assertEquals(urlTable.toString(), table.toString());
+
+ } catch (IOException e) {
+ e.printStackTrace();
+ }
+
+ assertEquals(table.headers.get(0), "\"Column A, Column A1\"");
+ }
+
+ @Test
public void testCSVStringToTable() throws IOException {
String initialString = "colA, colB, colC\nvalue1, value2. value3\nvalue4,
value5, value6";