Delphiでカンマ区切りCSVファイルを読み込みデータベースのテーブルに

インポートするという処理を作成しています。
現在はAssignFileメソッドでCSVファイルを開き
Readlnメソッドで1行ずつ読み込みながら
TStringListでカンマ区切りに分割し配列に格納し
SQLでINSERTするというようにしています。
ただ、このやり方だと読み込み元のCSVファイルのレコード数が
10万件以上あり、相当な時間がかかってしまうのです。
何か別のやり方でもっと速くインポートできる方法はないでしょうか?
よろしくお願いします。

環境
言語:Delphi 7.0
データベース:DB2/400にBDE接続
OS:Windows2000/XP

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:2005/06/29 15:11:23
  • 終了:--

回答(4件)

id:rokichan No.1

rokichan回答回数38ベストアンサー獲得回数02005/06/29 16:00:19

ポイント10pt

DB2のIMPORTコマンドを使用したらどうでしょうか?


直接ファイルを指定してCSVからデータをインポートしてくれます。


IMPORT文の使い方については色々なページで説明されているので確認してみてください。

id:nobutaku

IMPORTコマンドはDB2側で発行するコマンドですよね?ということはクライアントからCSVファイルをDB2がアクセスできる場所に置く必要がありますよね。

できればクライアントから直接更新したいのですが

2005/06/29 16:47:47
id:quintia No.2

quintia回答回数562ベストアンサー獲得回数712005/06/29 16:57:13

ポイント20pt

URLはダミーです。

トランザクションの単位を1000件に1回コミットの様に書くと、時間は短くなると思います。

例外発生一切無視のコードで書いてしまうと以下のような感じです。


var

ct: Integer;

begin

Database1.StartTransaction;

ct:=0;


while ({ファイルの行数分}) do

begin

{ファイルから1行読み込んでQueryにセットする}


Query1.ExecSQL;


Inc(ct);

if (ct = 1000) then

begin

Database1.Commit;

Database1.StartTransaction;


ct:=0;

end;


end;


Database1.Commit;

end;


1000とかいうマジックナンバーがもろにソース中に書いてありますけど擬似コードということで勘弁してください。

テストしてみてから回答したいところですが、適当なcsvもDBも無いので……。

id:nobutaku

なるほど。今は毎回コミットしてました。減らすと速くなるんですね。

2005/06/29 21:21:33
id:rokichan No.3

rokichan回答回数38ベストアンサー獲得回数02005/06/29 17:56:35

ポイント10pt

URLはダミーです。


先ほど回答したIMPORTの件ですが、

詳しく調べてみたところ、LOADを使用すれば、

Clientマシン側のデータも使用できると言う記述が書いているページがありました。


ただ、正確ではないのでDB2のSQLリファレンスなどを確認してみてください。

id:nobutaku

ありがとうございます。調べてみます。

2005/06/29 21:22:17
id:kinoopio No.4

kinoopio回答回数11ベストアンサー獲得回数02005/06/29 18:33:57

ポイント30pt

BDEのテキストドライバを使えば読み込みは早いと思いますが?いかがでしょう?

id:nobutaku

おー なるほど。そういう回答を待ってました。やってみます。

2005/06/29 21:23:49

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません