我遇到HSQL's text tablesHSQL CSV文本表格在多行讀取單個列
奇怪的行爲如果引用列分隔符是第一列條目,然後該行的最後一列項將在讀取到下一個線。
鑑於2列文本表創建:
statement.executeUpdate("CREATE TEXT TABLE " + archiveName + " ("
+ "message varchar(1000),"
+ "line varchar(1000))");
...用的csv文件:
",","col 2 line 1"
"col 1 line 2","col 2 line 2"
它會讀取線1爲:
Col1中:「 ,「
Col2:」col 2 line 1
「col 1 line 2」「
第2行根本不會被讀取。預期的行爲是:
線路1:
Col1中: 「」
Col2中: 「第2欄第1行」
線路2:
Col1中: 「第1欄第2行」
col2的: 「第2欄第2行」
奇怪的是,如果你把之間的空間引述分離器和LINE-COL1的收盤報價它會讀取正確的文件:
", ","col 2 line 1"
"col 1 line 2","col 2 line 2"
要重現創建提到的CSV文件,並運行此:
public void schemaCheck() {
final String archiveName = "test";
Connection connection;
try {
connection = DriverManager.getConnection("jdbc:hsqldb:file:test", "SA", "");
try (Statement statement = connection.createStatement()) {
statement.executeUpdate("DROP TABLE IF EXISTS " + archiveName);
statement.executeUpdate("CREATE TEXT TABLE " + archiveName + " ("
+ "message varchar(1000),"
+ "line varchar(1000))");
statement.executeUpdate("SET TABLE " + archiveName + " SOURCE 'archive/" + archiveName + ".csv;encoding=UTF-8'");
} catch (SQLException e) {
throw new IllegalStateException(e);
}
try (PreparedStatement statement = connection
.prepareStatement("SELECT * FROM " + archiveName)) {
ResultSet result = statement.executeQuery();
while (result.next()) {
System.out.println("Line:");
System.out.println("First col:");
System.out.println(result.getString(1));
System.out.println("Second col:");
System.out.println(result.getString(2));
}
} catch (SQLException e) {
throw new IllegalStateException(e);
}
} catch (SQLException e1) {
throw new IllegalStateException(e1);
}
}
這是使用HSQLDB V2.4.0
事情我已經嘗試:
- 有保證的桌子上的編碼參數的CSV的編碼一致文件
- Set all_quoted = true
- 用不同的行結束符測試CRLF,LF,CR。
這些都導致同樣的結果:在讀的最後一列。除了在引用的字段分隔符和結束引號之間放置空格以外,唯一可行的方法是確保所涉及的列不是第一列。
奇怪的是,如果你把另一列放在帶有分隔符的列之前,它可以正常工作,所以我用它作爲解決方法。 –