tagCANDY CGI VBレスキュー(花ちゃん) の Visual Basic 2010 用 掲示板(VB.NET 掲示板) [ツリー表示へ]   [Home]
一括表示(VB.NET VB2005)
タイトルCSVを一括取り込み
記事No8300
投稿日: 2008/10/07(Tue) 23:57
投稿者まつ
いつもお世話になっております。

WindowsVista、VB2005、Accessで開発しております。

CSVファイルをアクセスのmdbへ取り込む処理を作成しておりますが、
CSVファイルが4,000レコードあり、
今の組み方ではInsert文を4,000回発行するので
30分程度かかってしまいます。

この処理を簡潔に行う方法はないでしょうか?

テーブルに登録時に重複データは登録しないため、
主キーで重複している場合は重複エラーにし、次の取り込み処理にするためにも
1件1件 CSVから読んではテーブルへInsertといった処理をしています。

どなた様か良い方法がありましたらご教授を頂けないでしょうか。

[ツリー表示へ]
タイトルRe: CSVを一括取り込み
記事No8305
投稿日: 2008/10/10(Fri) 11:02
投稿者花ちゃん
どなたからもレスが無いようなので...。
私は、データベースの方はあまり詳しくないのでよくは解りませんが回答するには
少し情報が不足しているように思えます。

1.上記の動作は、VB での事なのか? Access での事なのか?
2.4,000レコード とは、 4,000 行なのか? 4,000 件(行×列)のデータなのか?
3.重複データ とは、どの部分の事なのか(例 1行全体  1データ毎(セル) etc..)
4.重複を照合する、mdb ファイルはどの程度のサイズなのか?
5.30分程度かかってしまいます と言ったって、CPU や メモリ 等にも影響されるので
  その辺の情報も書かないと、早い・遅いの論議はできないかと。
6.現状の具体的なコード等を投稿されないと良いか?悪いか判断しにくいのでは。
7.投稿時書かれている事以外で何か条件等の記入漏れとかないでしょうか?
  (後で、条件を小出しにされる方が結構多いので)

これらの事を一々確認しながら回答するのも面倒なので、レスをためらっておられる
のではないでしょうか?

[ツリー表示へ]
タイトルRe: CSVを一括取り込み
記事No8307
投稿日: 2008/10/10(Fri) 15:53
投稿者neptune
こんにちは

とりあえず

複数レコード追加クエリ:
http://office.microsoft.com/ja-jp/access/HA012314881041.aspx

INSERT INTO target [(field1[, field2[, ...]])] [IN externaldatabase]
SELECT [source.]field1[, field2[, ...]
FROM tableexpression

花ちゃんさんのおっしゃるとおり情報不足なのではっきりはいえませんが、
INSERT INTOステートメントを使ったらどうですか?

[ツリー表示へ]
タイトルRe^2: CSVを一括取り込み
記事No8308
投稿日: 2008/10/11(Sat) 12:27
投稿者まつ
情報が少なくて申し訳ありません。

VB2005でデータベースはAccessを使っています。

ヘッダーなしCSVを読み込みAccessへ登録します。
CSVとAccessの項目は合致しております。
登録の際、キーが重複しているレコードは登録せず、
重複していないレコードのみを登録する。

CSVを一件読んで、重複をチェックし1件Insertという方法は出来るのですが、
それでは件数が10万件あるデータですので処理に時間が掛かりすぎ、
処理の高速化をしたく思っています。

CSVをテーブルの様に扱う方法も分かったのですが、
CSVにはヘッダーが無いため、ヘッダーをつける編集が発生してしまいますので
修正案から外しました。


自分なりに考えてみたのえすが、
まず、CSVを全件、DataTableに取り込みます。
ここまではコーディングしました。

この後、データテーブルをキー項目の重複を考慮しながら
テーブルにInsertするところがGoogle等で調べたのですが
どうしても分かりません。

お忙しい中とは存じますがご教授頂けませんでしょうか。

自分なりにも調査を続行します。

[ツリー表示へ]
タイトルRe^3: CSVを一括取り込み
記事No8309
投稿日: 2008/10/11(Sat) 20:37
投稿者neptune
こんにちは

> CSVを一件読んで、重複をチェックし1件Insertという方法は出来るのですが、
> それでは件数が10万件あるデータですので処理に時間が掛かりすぎ、
時間かかりそうですね。
> CSVをテーブルの様に扱う方法も分かったのですが、
> CSVにはヘッダーが無いため、ヘッダーをつける編集が発生してしまいますので
> 修正案から外しました。
ADO.netでやったことは無いのですが、schema.iniでフィールド定義してやれる
と思いますので、SQLで重複チェックもできませんか?

使用例を検索したらありました。
http://park5.wakwak.com/~weblab/selectTextFile-TSV.html

[ツリー表示へ]
タイトルRe^4: CSVを一括取り込み
記事No8311
投稿日: 2008/10/13(Mon) 00:52
投稿者まつ
色々とご教授有難うございます。

自分なりに調べて、やってみた事は
1.CSVファイルにヘッダーをつける。
2.これをテーブルの様に扱いテーブルに登録

Schema.iniを設定すると1.の部分が省略できるのですね。
凄く有難い知識です。本当に有難うございます。

ところで、今回は行わないことにしたのですが、
一旦、データテーブルに入れた場合、
テーブルに登録するには、1件1件ループするしかないのでしょうか。

[ツリー表示へ]
タイトルRe^3: CSVを一括取り込み
記事No8310
投稿日: 2008/10/13(Mon) 00:06
投稿者やじゅ
> CSVを一件読んで、重複をチェックし1件Insertという方法は出来るのですが、
> それでは件数が10万件あるデータですので処理に時間が掛かりすぎ、
> 処理の高速化をしたく思っています。
>

重複チェックはSQL側に任せるとして、プライマリーキーが無い一時テーブルを
作成し、そこにCSVデータをINSERTします。

一時表から重複データを除くSQLを作成して、本来のテーブルにINSERT INTO SELECT
します。

[ツリー表示へ]