2017-10-19 107 views
0

我遇到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。

这些都导致同样的结果:在读的最后一列。除了在引用的字段分隔符和结束引号之间放置空格以外,唯一可行的方法是确保所涉及的列不是第一列。

+0

奇怪的是,如果你把另一列放在带有分隔符的列之前,它可以正常工作,所以我用它作为解决方法。 –

回答

0

您需要在文本源设置指定all_quoted:

"SET TABLE " + archiveName + " SOURCE 'archive/" + archiveName + ".csv;encoding=UTF-8;all_quoted=true'" 

更新:这个问题是检查,发现是一个错误。 HSQLDB版本2.4已经修复。1

+0

对不起,忘了提及我已经尝试了所有常见的东西,如all_quoted,更改文件编码和检查行结束。这里的问题不在于它处理第1行第1行,就好像它没有引号一样,而是它在第一列中的字段分隔符之后读取最后一列。我会编辑我的问题来澄清。 –