- 締切済み
100万レコード規模のaccessDBテーブルからNullを置換する方法
半角スペースを含むcsvファイルを、accessのテーブルとしてインポートした際、スペースがnullとして扱われてしまいます。 これを0文字の空白に置換しているのですが、時間がかかり、かつ、成功したのかどうかよく分からないために困っています。 下記の2つの方法でnullを0文字の空白に変換してみたのですが、レコード数が多すぎるのか、置換がすべて成功していない模様です。 テーブルのフィールドを選択し、「置換」する フィールドのnullを見つけ、更新するクエリーを書く できれば、インポート元のcsvファイルやインポート後のテーブルを分割させずにメンテナンスを行いたいのですが、こういう場合に有効な対処方法というのはどのようなものがあるのでしょうか? 1.置換を高速化するアイディア 2.インポート段階で変換する方法があるかどうか? 3.置換結果を確認する方法 私は今までデータベースというものを全く使ったことがないので、これ以上のことがわかりません。ぜひ、専門家のご意見を頂きたいと思います。 よろしくお願いいたします。 【csvファイル仕様】 データ規模:100万行、1行あたり10~20列 元データはフィールド毎に固定長 データ形式:テキスト型、長整数型が混在 複数のテキスト型フィールドに半角スペースを含む 長整数型のフィールドは0を含む 【mdbファイル仕様】 マスタテーブルを格納する。他のmdbにあるクエリから参照される。 テーブル形式 テキスト型フィールド:255文字(今のところ・・・) 数値型フィールド:長整数型 規模: インポート後のmdbサイズは1テーブルあたり300MB程度。 そのmdbは同規模のテーブルを最高3程度まで保持する。 【使用環境条件】 OS:windows XP 最新SP DB:Access 2003 mdbファイルはネットワーク上にある。 ローカルHDDにコピーして作業することは可 CPU:Celeron 2.0GHz Memory:2GB Memory HDD:空き40GB以上
- みんなの回答 (4)
- 専門家の回答
みんなの回答
- layy
- ベストアンサー率23% (292/1222)
定形化されたインポートでないので、 TransferTextは使わない、での回答のつもりです。 「,,」を「," ",」に置き換えてから 1項目単位にテーブルへ追加で・・・、ということでどうでしょう。
- layy
- ベストアンサー率23% (292/1222)
ACCESSはこういうレコード編集については 更新クエリや標準のインポート定義でやるには向いていないかもしれません。 「インポート→テーブルに出来上がる→更新クエリ→更新後テーブルが出来上がる」 これでは何万件を何度も処理します。効率悪いと思います。 「置換しながらインポートしたい」ことをモジュールで記載します。 ・CSVファイルを開く ・出力はテーブルにする。ここで出来上がるテーブルは直っている状態。 ・EOFになるまで繰り返す ・1レコード分読み込み ・null値を置き換えながらレコードをテーブルのフィールドへ出力 このモジュールを実行させるために フォームでボタン1つ用意し押せば実行、とします。 やりたいことはこれに近いですが、そのまま使えるかは確認してください。参考です。 http://vine-linux.ddo.jp/access/materials/file/file2.php
- hn_cthulhu
- ベストアンサー率100% (1/1)
私が銀行で100万件を超えるデータをWindows98時代にAccess97で処理させられた時の方法ですが、何かの参考になればと思い書きました。 私が処理した方法はインポートするCSVと同じフィールド名を持つ空のテーブルを別に用意ました。 そして取り込んだCSVのデータを店舗番号で条件抽出したクエリを作製→この際にNullを置き換えるフィールドを関数で変換しておきました。 後はこの条件抽出をしたクエリを元に別に用意した空のテーブルに追加クエリーを実行し追加していきました。 この条件抽出したクエリをSQLに変換し、店舗番号をFor...Next...で変化させて追加クエリもSQLに変換しDocmd.RunSQLで実行するモジュールを記述すればボタン一つで自動化できます。 この方法で一気に100万件の変換をかけるより早く処理でき、しかも取り込んだCSVはそのままテーブルとして残るので、店舗番号と預金等の科目と口座番号をキーとした不一致クエリを作ることで、変換結果の確認が可能となりました。 その後にネットワーク上のDBにデータを渡してあげれば作業終了です。 本来であれば細かくモジュールの記述等もあわせて記載すれば良いのでしょうが、何事もヒントを元に考えた上で経験するのが一番と思い、あえてモジュール等の記載は避けました。 ちなみにこの方法はAccess2003でも動きますし、一気に処理するより確実に早かったです。 また、CSVをテーブルとしてインポートするのではなく、リンクテーブルとして使用することでハードディスクのデータ容量もある程度削減できます。 ある程度のところまではウィザードで作れると思いますので、実力アップのために頑張って下さい。ここにいる全員はきっとあなたのお力になれる人ばかりですから。
お礼
お返事が遅くなりすみません。 書き込み頂いた内容で、処理のイメージが膨らみました。 「店舗番号」では無いのですが、似た役割を持つデータがありますので、そのデータを使って処理を細かく分けたいと思います。 この書き込みをしてから、別の仕事が入ってしまったので作業中断中でありますが、トライしてみたいと思います。 ありがとうございました。
- ShowMeHow
- ベストアンサー率28% (1424/5027)
100万レコードをアクセスに入れて実使用に耐えうるものができるのかはさておき、 どの程度の頻度でデータのインポートが発生するのかによりますが、 私だったら、一行ずつ読んで正しいデータに変換しながらテーブルに格納していくと思います。 でも、やはりそのレコード数だったらほかのdbを検討すべきだと思います。
補足
ご回答ありがとうございます。 なるほど、インポートの際に、accessのインポート機能を用いるのではなく、インポートするマクロを書けばいいってことですよね。
お礼
情報ありがとうございます。 DoCmd.TransferText メソッドでtableにrecordを追加すると思いますが、1行ずつnull置換ができるかどうがポイントのようですね。