大きな区切り文字のテキストファイルでデータ処理を行おうとしたとき、データベースシステムを使用して作業を行い、速度を上げることにしました。目的の目標を達成するために、6つの重要なプロセスを実行するために開発したプログラムが必要でした。
- その場でローカルデータベースを作成する
- 列またはタイプの数が不明なテーブルを作成します
- 区切られたファイルをテーブルにインポートします(必要に応じて2と3を繰り返します)
- SQLクエリを実行して、必要なレコードを取得します
- 結果を別の区切られたテキストファイルにエクスポートします
私は、1つを実行する機能と、他の4つを実行する機能が約束されているため、ApacheのDerbyデータベースシステムを使用することにしました。
データベースを作成します。
String connectionName = "jdbc:derby:" + databaseName;
if (createDatabase) {
connectionName += ";create=true";
}
Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance();
connectionToDatabase = DriverManager.getConnection(connectionName);
これは機能し、ファイルから最初のレコードを取得し、必要な列の数を知るためにフィールドの量を取得します。
String statement = "CREATE TABLE " + tableName + " (";
for (int i = 1; i <= tableAmount; i++) {
statement += (char) (64 + i) + " VARCHAR(100)";
if (i != tableAmount) {
statement += ",";
}
}
PreparedStatement pstmt = connectionToDatabase.prepareStatement(statement + ")");
pstmt.executeUpdate();
connectionToDatabase.commit();
これにより、選択した名前でテーブルが作成され(「HELLO」という名前のテーブルを作成するだけで実験しました)、作成したテーブルにファイルをインポートしようとします。
try {
String schemaName = "APP";
String tableName = "HELLO";
String fileName = "C:\\Hello.txt";
String columnDelimiter = fieldDelimiter;
String characterDelimiter = "";
String codeset = "UTF-8";
short replace = 0;
Import.importTable(connectionToDatabase, schemaName, tableName, fileName,
columnDelimiter, characterDelimiter, codeset,
replace, false);
} catch (SQLException e) {
do {
System.out.println("SQLState:" + e.getSQLState());
System.out.println("Error Code:" + e.getErrorCode());
System.out.println("Message:" + e.getMessage());
Throwable t = e.getCause();
while (t != null) {
System.out.println("Cause:" + t);
t = t.getCause();
}
e = e.getNextException();
StackTraceElement st[] = e.getStackTrace();
for (int i = 0; i < st.length; i++) {
System.out.println("Stack Trace " + i + ":" + st[i]);
}
} while (e != null);
}catch (Exception e) {
System.err.println("Exception: " + e.getMessage());
}
しかし、これを実行すると、次のようになります。
Exception: Syntax error: DERBY-PROPERTIES
私は何を間違えましたか、そして可能であれば、これを機能させるために何をすべきですか?
編集:Import.importTableが呼び出された行でエラーが発生します。エラー時に出力を修正した後(上記)、出力として次のようになります。
SQLState:42X01
Error Code:30000
Message:Syntax error: DERBY-PROPERTIES.
Cause:java.sql.SQLException: Syntax error: DERBY-PROPERTIES.
Cause:ERROR 42X01: Syntax error: DERBY-PROPERTIES.
Stack Trace 0:org.apache.derby.impl.jdbc.SQLExceptionFactory40.getSQLException(Unknown Source)
Stack Trace 1:org.apache.derby.impl.jdbc.Util.generateCsSQLException(Unknown Source)
Stack Trace 2:org.apache.derby.impl.jdbc.TransactionResourceImpl.wrapInSQLException(Unknown Source)
Stack Trace 3:org.apache.derby.impl.jdbc.TransactionResourceImpl.handleException(Unknown Source)
Stack Trace 4:org.apache.derby.impl.jdbc.EmbedConnection.handleException(Unknown Source)
Stack Trace 5:org.apache.derby.impl.jdbc.ConnectionChild.handleException(Unknown Source)
Stack Trace 6:org.apache.derby.impl.jdbc.EmbedPreparedStatement.<init>(Unknown Source)
Stack Trace 7:org.apache.derby.impl.jdbc.EmbedPreparedStatement20.<init>(Unknown Source)
Stack Trace 8:org.apache.derby.impl.jdbc.EmbedPreparedStatement30.<init>(Unknown Source)
Stack Trace 9:org.apache.derby.impl.jdbc.EmbedPreparedStatement40.<init>(Unknown Source)
Stack Trace 10:org.apache.derby.jdbc.Driver40.newEmbedPreparedStatement(Unknown Source)
Stack Trace 11:org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
Stack Trace 12:org.apache.derby.impl.jdbc.EmbedConnection.prepareStatement(Unknown Source)
Stack Trace 13:org.apache.derby.impl.load.Import.performImport(Unknown Source)
Stack Trace 14:org.apache.derby.impl.load.Import.importTable(Unknown Source)
Stack Trace 15:root.DatabaseManager.<init>(DatabaseManager.java:46)
Stack Trace 16:root.Startup.main(Startup.java:21)
以下は私のderby.logからの出力です
Wed Nov 14 20:04:23 CST 2012:
Booting Derby version The Apache Software Foundation - Apache Derby - 10.9.1.0 - (1344872): instance a816c00e-013b-01cf-55d8-000000c58148 on database directory -omitted- with class loader sun.misc.Launcher$AppClassLoader@1ba34f2 Loaded from file:/-omitted-/lib/derby.jar java.vendor=Sun Microsystems Inc. java.runtime.version=1.6.0_33-b05 user.dir=-omitted-
derby.system.home=null
Database Class Loader started - derby.database.classpath=''
問題を理解しました:
- 間違ったドライバーを使用していました:組み込みドライバーの代わりにクライアントドライバーを使用していました
不適切な機能を使用していました。それはいくつかの編集で動作するでしょうが、正しいものは
Statement s = connectionToDatabase.createStatement(); s.execute("CALL SYSCS_UTIL.SYSCS_IMPORT_TABLE(null,'" + tableName + "','" + filePath + "','" + columnDelimiter + "',null,null,1)"); connectionToDatabase.commit();
- 最後に、最後の問題は、使用していたテキストファイルの最後の行に次の行がないことでした。