2017-10-19 109 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行,就好像它沒有引號一樣,而是它在第一列中的字段分隔符之後讀取最後一列。我會編輯我的問題來澄清。 –