我遇到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。
这些都导致同样的结果:在读的最后一列。除了在引用的字段分隔符和结束引号之间放置空格以外,唯一可行的方法是确保所涉及的列不是第一列。
奇怪的是,如果你把另一列放在带有分隔符的列之前,它可以正常工作,所以我用它作为解决方法。 –