• 締切済み

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以上

  • ksegs
  • お礼率50% (5/10)

みんなの回答

  • layy
  • ベストアンサー率23% (292/1222)
回答No.4

定形化されたインポートでないので、 TransferTextは使わない、での回答のつもりです。 「,,」を「," ",」に置き換えてから 1項目単位にテーブルへ追加で・・・、ということでどうでしょう。

  • layy
  • ベストアンサー率23% (292/1222)
回答No.3

ACCESSはこういうレコード編集については 更新クエリや標準のインポート定義でやるには向いていないかもしれません。 「インポート→テーブルに出来上がる→更新クエリ→更新後テーブルが出来上がる」 これでは何万件を何度も処理します。効率悪いと思います。 「置換しながらインポートしたい」ことをモジュールで記載します。 ・CSVファイルを開く ・出力はテーブルにする。ここで出来上がるテーブルは直っている状態。 ・EOFになるまで繰り返す  ・1レコード分読み込み  ・null値を置き換えながらレコードをテーブルのフィールドへ出力 このモジュールを実行させるために フォームでボタン1つ用意し押せば実行、とします。 やりたいことはこれに近いですが、そのまま使えるかは確認してください。参考です。 http://vine-linux.ddo.jp/access/materials/file/file2.php

ksegs
質問者

お礼

情報ありがとうございます。 DoCmd.TransferText メソッドでtableにrecordを追加すると思いますが、1行ずつnull置換ができるかどうがポイントのようですね。

回答No.2

私が銀行で100万件を超えるデータをWindows98時代にAccess97で処理させられた時の方法ですが、何かの参考になればと思い書きました。 私が処理した方法はインポートするCSVと同じフィールド名を持つ空のテーブルを別に用意ました。 そして取り込んだCSVのデータを店舗番号で条件抽出したクエリを作製→この際にNullを置き換えるフィールドを関数で変換しておきました。 後はこの条件抽出をしたクエリを元に別に用意した空のテーブルに追加クエリーを実行し追加していきました。 この条件抽出したクエリをSQLに変換し、店舗番号をFor...Next...で変化させて追加クエリもSQLに変換しDocmd.RunSQLで実行するモジュールを記述すればボタン一つで自動化できます。 この方法で一気に100万件の変換をかけるより早く処理でき、しかも取り込んだCSVはそのままテーブルとして残るので、店舗番号と預金等の科目と口座番号をキーとした不一致クエリを作ることで、変換結果の確認が可能となりました。 その後にネットワーク上のDBにデータを渡してあげれば作業終了です。 本来であれば細かくモジュールの記述等もあわせて記載すれば良いのでしょうが、何事もヒントを元に考えた上で経験するのが一番と思い、あえてモジュール等の記載は避けました。 ちなみにこの方法はAccess2003でも動きますし、一気に処理するより確実に早かったです。 また、CSVをテーブルとしてインポートするのではなく、リンクテーブルとして使用することでハードディスクのデータ容量もある程度削減できます。 ある程度のところまではウィザードで作れると思いますので、実力アップのために頑張って下さい。ここにいる全員はきっとあなたのお力になれる人ばかりですから。

ksegs
質問者

お礼

お返事が遅くなりすみません。 書き込み頂いた内容で、処理のイメージが膨らみました。 「店舗番号」では無いのですが、似た役割を持つデータがありますので、そのデータを使って処理を細かく分けたいと思います。 この書き込みをしてから、別の仕事が入ってしまったので作業中断中でありますが、トライしてみたいと思います。 ありがとうございました。

  • ShowMeHow
  • ベストアンサー率28% (1424/5027)
回答No.1

100万レコードをアクセスに入れて実使用に耐えうるものができるのかはさておき、 どの程度の頻度でデータのインポートが発生するのかによりますが、 私だったら、一行ずつ読んで正しいデータに変換しながらテーブルに格納していくと思います。 でも、やはりそのレコード数だったらほかのdbを検討すべきだと思います。

ksegs
質問者

補足

ご回答ありがとうございます。 なるほど、インポートの際に、accessのインポート機能を用いるのではなく、インポートするマクロを書けばいいってことですよね。

関連するQ&A

  • テーブルを使った置換

    Access2002 Accessでクエリ実行時に特定の文字列を置換したいと思っています。 今までは置換する文字列が1つだけだったので、replace関数を使って直接置換する文字列を書いていたのですが、置換する文字列が今後増えてきそうなのでテーブルで管理したいと思っています。 置換用テーブル 元 ,置換後 000022,002078 000218,002403 000447,002703 クエリは単純な選択クエリなのですが、上記のようなテーブルを使ってクエリ実行時に文字を置換する方法がわかりません。 よろしくお願いします。

  • CSVからNULL値をインポート

    phpMyAdminを使用してcsvからデータをインポートしようとしています。 通常の値は問題なくインポートできるのですが、NULL値があるフィールドがどうしても「0」になってしまいます。(そのフィールドはNULL値が入力可で、デフォルト値もNULLです) csvからNULL値をインポートする方法をご教授下さい。 宜しくお願いします。 ※\Nを入力するとNULLになるという情報があったため、 "1";"2";"3";"4";\N "1";"2";"3";"4";"\N" (1.2.3.4は適当な文字で、5番目をNULLにしたい) の両方を試みましたが、入力結果は「0」でした。 phpMyAdmin - 2.10.2 MySQL クライアントのバージョン: 5.0.18 フィールド区切り記号 ; フィールド囲み記号 ""

    • ベストアンサー
    • MySQL
  • CSVファイルをアクセスのテーブルに出力する

    こんにちは Access VBA初心者です。 やりたい処理なのですが CSVファイルをmdb内であらかじめ作成されているテーブルに出力したいのですが、 最初にTransferTextwでワークのテーブルにインポートして そのワークテーブルを1レコードずつ読み込みmdbのあらかじめ作成されているテーブルにINSERTしていくという方法しか今思いつきません。 インポートするとワークテーブルはすべてテキスト型になっていますが、 それを違う型の項目にINSERTするということなど可能なのでしょうか? それとももっとスマートな方法があるのでしょうか? ざっくりと書いてしまいましたが、よろしくお願いいたします。

  • NULL値のレコードを検索(フィルタ)したい

    アクセス2003です。 画像の様なフォームを作成しました。 感想フィールドが未記入(NULL)のレコードにフィルタを掛けたいのですが Private Sub Click() Form_テーブル1.SetFocus Form_テーブル1.Filter = "感想 = '" & Null & "'" Form_テーブル1.Filter = "感想 = '" & "" & "'" Form_テーブル1.Filter = "感想 <> '" & "*" & "'" Form_テーブル1.FilterOn = True Form_テーブル1.Requery End Sub どれも引っかかりません。 クエリでデータ型を取得してみると NULLが返って来ます。 (SELECT TypeName([テーブル1]![感想]) AS 感想 FROM テーブル1;) Null値にフィルタを書ける方法を教えてくださいませ。

  • 選択クエリーで 2つのテーブルの項目が Null どうしのデータを抽出するには?

    初心者です、教えてください。 テーブルが、2つあって テーブル名: T1 T2 フィールド1: A1 B1 フィールド2: A2 B2 フィールド3: A3 B3 とあった時、選択クエリーで T1 と T2 のフィールドの A1-B1、A2-B2、A3-B3 が、 一致したものを表示するクエリーを作成します。 でも、A2、A3、B2、B3のデータ中には、それぞれ Null値が入っていて、 A2-B2、または、A3-B3 が、Nullどうしなら、一致とみなして、表示するには、 どうしたらいいのでしょうか? Nullのみどうしのデータで、Nullのフィールドを 除いた選択クエリーをつくって、あとで合わせてもいいのですが、 実際のテーブルは、そういうフィールドが、いっぱいあって、大変なんです。 簡単に表示する方法は、あるでしょうか? 初心者なのでむずかしいことは、 やったことがなくて、すいませんが、わかる方がいらっしゃたら、お願いします。

  • ACCESS2000のテーブルのNULL

    教えてください!! ACCESS2000のテーブルにある、フィールドのデータの中にある”NULL”を数字に置き換える方法を教えてください。置き換えるのは、いくつもNULLがあっても一つでいいのですが・・・。 よろしく、お願いいたします。

  • ACCESS2000 クエリをテーブル化するマクロ(VBA)おしえてください

    こんにちは。 http://oshiete1.goo.ne.jp/kotaeru.php3?q=1801262 の質問者です。コレの続きを教えてください。 まとめますと、クロス集計クエリや、ユニオンクエリをそのまま扱うと、データや計算式がからまってエラーになったり、処理が遅かったりするので、テーブル化してからいじりたいのです。 マクロは データベース変換 変換の種類…インポート データベースの種類…MS ACCESS データベース名…L:\パス\パス\ファイル名.MDB オブジェクトの種類…クエリ オブジェクト名…クエリ名 変換先名…テーブル名 テーブル構造のみ変換…いいえ としてみましたが、クエリとしてインポートされてしまいます。 いちどCSVか何かでエクスポートしてから、テキスト変換するという手もありますが、もっとスマートな方法がありましたら教えてください。 VBA も勉強中なので、VBAでお答えいただいてもけっこうです。 よろしくお願いします。

  • アクセス テーブル作成クエリ

    アクセスです。 元のテーブルには「内容」と言うフィールドがあり、データ型をメモ型にしています。 値は255文字以上入れています。 そのテーブルを元にテーブル作成クエリで新規にテーブルを作成すると、 メモ型の内容フィールドは、テキスト型になり、全ての文字が入りません。 元がメモ型のフィールドでもテーブル作成クエリでテーブルを作成しても テキスト型にならないようにする方法はありますか?

  • Access のテーブル上で文字列の操作をしたい

    Excelからデータをインポートし、他のデータベースとリンクしているデータとの不一致データを抽出したいのですが、 Excelからインポートしたデータは ・全て大文字 ・文字の後に半角1スペース に対し、データベース側は ・全て小文字 ・文字の後ろにはスペースがない の為、全て不一致となってしまいます。 Excelからインポートしたデータをテーブル上で「文字を全て小文字に変換」し「不要なスペースの削除」をする事はできませんでしょうか? クエリ上で文字を小文字にする事はできましたが、変換した(テーブルにフィールドがない)データとクエリする事ができず煮詰まってしまいました。。 どなたか教えてください。。

  • 他のMDBファイルのテーブルをクエリで表示させることは可能ですか?

    他のMDBファイルのテーブルをクエリで表示させることは可能ですか? C:\Documents\test1.mdbのクエリで C:\Documents\test2.mdbのテーブル1のフィールド1を表示されることは可能でしょうか? SQL文を教えてください。 よろしくお願いします。