1

CSVファイルを読み取り、HSQLDBを使用して選択し、結果を別のCSVファイルとして保存するツールがあります。詳細はこちら: http://ondra.zizka.cz/stranky/programovani/java/apps/CsvCruncher-csv-manipulation-sql.texy

あるタスクに使用したとき、次のようになりました。

java -jar CsvCruncher-1.0.jar result.csv foo.csv 'SELECT * FROM indata'

INFO:   SQL: CREATE TEXT TABLE indata ( xrelease VARCHAR(255), xtype VARCHAR(255), xartifact VARCHAR(255), xversion VARCHAR(255) )
INFO:   SQL: CREATE TEXT TABLE output ( XRELEASE VARCHAR(255), XTYPE VARCHAR(255), XARTIFACT VARCHAR(255), XVERSION VARCHAR(255) )
INFO:   User's SQL: INSERT INTO output (SELECT * FROM indata)
INFO: Database closed
Exception in thread "main" java.sql.SQLException: integrity constraint violation: unique constraint or index violation: SYS_IDX_10027
    at org.hsqldb.jdbc.Util.sqlException(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.fetchResult(Unknown Source)
    at org.hsqldb.jdbc.JDBCPreparedStatement.executeUpdate(Unknown Source)
    at org.jboss.qa.cvscruncher.Cruncher.crunch(Cruncher.java:187)
    at org.jboss.qa.cvscruncher.App.main(App.java:26)
    at Crunch.main(Crunch.java:9)
Caused by: org.hsqldb.HsqlException: integrity constraint violation: unique constraint or index violation: SYS_IDX_10027
    at org.hsqldb.error.Error.error(Unknown Source)
    at org.hsqldb.index.IndexAVL.insert(Unknown Source)
    at org.hsqldb.persist.RowStoreAVLDiskData.indexRow(Unknown Source)
    at org.hsqldb.Table.insertSingleRow(Unknown Source)
    at org.hsqldb.StatementDML.insertRowSet(Unknown Source)
    at org.hsqldb.StatementInsert.getResult(Unknown Source)
    at org.hsqldb.StatementDMQL.execute(Unknown Source)
    at org.hsqldb.Session.executeCompiledStatement(Unknown Source)
    at org.hsqldb.Session.execute(Unknown Source)
    ... 5 more

ログからわかるように、少なくとも明示的に作成されたインデックスはありません。HSQLDB のマニュアルで自動作成された制約を見つけようとしましたが、見つかりませんでした。

だけならSELECT 1 FROM indata大丈夫です。だから私はそれがデータ自体に何かあると思います。その場合、ここにあります: http://pastebin.com/8QiY2HXx (xキーワードの衝突を防ぐため)。

アップデート:

CSV から読み取ったデータをダンプすると、少し奇妙になります。

 -------
 XRELEASE: 5.1.0-SNAPSHOT
 XTYPE: DEP
 XARTIFACT: org.apache.maven:maven-ant-tasks
5XVERSION: 2.0.9
 -------
 XRELEASE: 5.1.0-SNAPSHOT
 XTYPE: DEP
 XARTIFACT: org.jboss.seam.integration:jboss-seam-int-microcontainer
5XVERSION: 5.1.0.CR1
 -------
 XRELEASE: 5.1.0-SNAPSHOT
 XTYPE: DEP
 XARTIFACT: org.jboss.seam.integration:jboss-seam-int-jbossas
5XVERSION: 5.1.0.CR1
 -------
...

xversion列が何らかの形で変更されているようです。コードは単純ですSystem.out.println(" "+ metaData.getColumnLabel(i) + ": "+ rs.getObject(i) );

何がこれを引き起こす可能性がありますか?

ありがとう、オンドラ

4

2 に答える 2

4

問題は入力ファイルにありました - それは0x0D改行として含まれていて、どういうわけかそれは HSQLDB を壊しました。彼らが確認できるように報告します。少なくとも、無効な入力を拒否するか、改行をより適切に変換する必要があります。

于 2010-08-25T22:42:23.823 に答える
2

データベースの .script ファイルと .log ファイルを確認してください。これにより、データベース内の実際のテーブル定義が表示されます。原因が見つからない場合は、Bug Tracker (「サポート」ページを参照) を介して HSQLDB にバグを報告し、サンプル データ ファイルを添付してください。バグは迅速に修正されます。

于 2010-08-25T15:25:31.837 に答える