人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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

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

●質問者: のぶ
●カテゴリ:コンピュータ
✍キーワード:CSV DB2 Delphi OS SQL
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● rokichan
●10ポイント

http://www02.so-net.ne.jp/~khayashi/db2da/import.html

データの移入

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


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


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

◎質問者からの返答

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

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


2 ● quintia
●20ポイント

http://ask.jp/

Ask.jp

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も無いので……。

◎質問者からの返答

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


3 ● rokichan
●10ポイント

http://www.hatena.ne.jp/awindow?qid=1120025483

URLはダミーです。


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

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

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


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

◎質問者からの返答

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


4 ● kinoopio
●30ポイント

http://www2.big.or.jp/~osamu/Delphi/delphi-browse.cgi?index=0071...

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

◎質問者からの返答

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

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ