[[20160616114120]] 『配列のキーからレコード抽出』(フェンダー) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『配列のキーからレコード抽出』(フェンダー)

 100-1111,0,0,ああああ,1
 100-1111,0,1,いいいい,2
 100-1111,0,0,うううう,3
 100-1111,0,1,ええええ,4
 100-1111,0,0,おおおお,5

 上記のようなデータを
 3つ目の配列が0の場合

 100-1111,0,0,ああああ,1
 100-1111,0,0,うううう,3
 100-1111,0,0,おおおお,5

 のようにデータ抽出して
 CSVの入出力を
 行ないたいのですが
 なにかサンプルデータ
 提示頂けますでしょうか。

 現在
 1000000万行クラスの
 データ抽出は
 アクセスから行っているのですが
 配列が
 250ぐらいあると
 エクスポートできない状態で
 困っております。

 どうぞよろしくお願いいたします。

< 使用 Excel:Excel2010、使用 OS:unknown >


100億レコードというのは考えにくいので、おそらく100万レコードの間違いと思いますが…。
(それでも100万レコードのデータを扱うなんて、Excelの掲示板で聞く話ではないなぁ…)

Accessであれば、3列目の要素が0なものを除いたものを一覧するクエリを作成し、テーブルを直接エクスポートするのではなく、クエリの方をエクスポートしてはどうでしょうか?

それとも、Accessもビューのために使っているだけであり、大元のデータはDBサーバにある、というのでしたら、3列目の要素が0なものを除外するSQL文を実行するだけかと。
(???) 2016/06/16(木) 12:52


すいません。
100万レコードになります。
ご提案の認識が正しければ
データ抽出は
アクセスから行っているのですがと記載したのは
クエリの方をエクスポートしてダメだったという事になります。

アクセスの掲示板ではありませんので
トラブルを記載する予定ではありませんでしたが
ご提案がありましたので記載させて頂きます。

問題点
フィールド数が多い場合
クエリの方をエクスポートしても
フィールド開始位置が有効ではないとなり
テキストのアウト不可

対処方法
DoCmd.TransferText acExportDelim, , "ファイル名クエリ", "C:" & "\" & "ファイル名.csv", True
End Sub
よりエクスポート

上記方法から100万行クラスを
5分以内でエクスポート出来たのですが
すべての配列にダブルクオートが
付加されてしまいます。

もちろんVBで配列が多い場合で
ダブルクオートが付かずに
エクスポートする方法も
調べました。

さらに抽出したデータを
データ編集する際に
ダブルクオートがあるために
あとあと
処理が難しくなってくるので
別方法を考えている最中で
今回投稿させて頂きました。

(フェンダー) 2016/06/16(木) 14:25


AccessのVBAマクロではなく、右クリックからのエクスポートで…、という事なのですが、まぁ同じ結果になるでしょうね。手作業なら、ダブルクォートの有無は指定できませんでしたっけ? また、カンマ区切りだと改行表現するためにダブルクォート必須になってしまうので、TAB区切りに変えてみるとか。

更には、選択する列を数個にしても、エクスポートできませんか? 列数の問題なのか、レコード数の問題なのかが知りたいです。

あと、一番大事な点ですが、DBサーバは何でしょうか? Accessは抽出のために使っている、ということは、サーバは別なのか、と思うのですが。(100万件超えは、Access単体でも無謀な数字ですから)

DBサーバが別なのであれば、Excel VBAからADO接続してデータを読み込む、という手も考えられます。
Access相手では、Access自体がパンクしているならば、DB接続しても正しく動かない可能性がありますから。
(???) 2016/06/16(木) 14:48


 >右クリックからのエクスポートで…、という事なのですが、
 この方法はレコードは関係なく
 列数の問題でエクスポート出来ません。
 手作業ですとダブルクォートの有無は指定できます。

 DBサーバーは別で
 サンマイクロシステムズです。

 アクセスは抽出管理として単体ソフトとして
 使用しております、
 あとレコード数は
 先日も100万件クラスでも対応してますので
 問題ないと思います。

 検証済みですが
 TransferText acExportDelimですと
 カンマ以外
 TAB区切りとかにできないんです。

 こちらでの検証結果
 1手作業でのインポート列数250まで(記憶ですと)
 2手作業でのエクスポート列数129まで
 これ以上列数が増えると
 手作業での
 インポート・エクスポート対応不可になります。

エクセルVBAで難しい場合
良いのがあれば抽出ソフトを導入してもよいのですが・・・

(フェンダー) 2016/06/16(木) 16:06


Sunということは、DBはOracleですね?

同じOracleでもMySQLの方ならばフリーなのですが、Oracleだけは専用クライアントが必要なため、残念ながら私は今試す事ができません。Accessでも、Oracle提供のODBCドライバ経由で接続されているかと思います。
DB直ではないので、いろいろ制限がきついものと思われます。

市販ツールでできることならば、DBにSQLを投げるVBAコーディングでもできると思います。
AdoでOracle DBを使った時のオープン例だけ書きますので、検索の参考にしてみてください。

    Dim CON As ADODB.Connection

    With CON
        .Provider = "OraOLEDB.Oracle"
        .Properties("Data Source") = 
        .Properties("USER ID") = 
        .Properties("Password") = 
        .Open
    End With
(???) 2016/06/16(木) 16:24

 こんにちは。生徒側なんですが、もしかして?と思ったので書き込みます。

 手動でエクスポートの設定をすすめて、ダブルクォート無しに設定後
 エクスポートの定義を保存してそれを使用するのはどうでしょう。

 DoCmd.TransferText acExportDelim, , "ファイル名クエリ", "C:" & "\" & "ファイル名.csv", True 
 を
 DoCmd.TransferText acExportDelim,"エクスポート定義", "ファイル名クエリ" (以下略
 にしたらダブルクウォートは無くなりませんか?
(くろたろう) 2016/06/16(木) 17:13

 ???さん。
 総称はOracleということになると思います。
 オープン例どうもありがとうございます。
 参考に
 させていただきます。

 くろたろうさん。
 現在、検証環境がないのでご確認です。

 手動でエクスポートの設定をすすめて、ダブルクォート無しに設定後
 エクスポートの定義を保存するご提案ですが

 実は一度その方法を試したことが
 あるのですが
 手順方法が間違っていたかもしれません。
 そこでご確認ですが
 保存する際に
 フィールド開始位置が有効ではないとなり
 エクスポート定義を保存できずに
 キャンセルしか
 選択権がないのですが
 このままキャンセル
 そして

 DoCmd.TransferText acExportDelim, , "エクスポート定義",
 "ファイル名ク エリ", "C:" & "\" & "ファイル名.csv", True
 End Sub
 それからエクスポート

 この方法手順で認識は合っていますでしょうか。

(フェンダー) 2016/06/16(木) 22:36


他の列数が多いテストデータでも
チェックしたのですが
どうやら、列数の問題ではなく
1レコードの長さだったようです。

手動の作業から、文字列の引用符をなしにして
保存を押す際に、定義を
例えば、エクスポート定義とし
Okを
押すと、
有効範囲ではないとなるのですがこれで
VBA からエクスポート定義を追加しても、
いずれの引数とデータ型が対応してませんと
なります。
手順は合ってますでしょうか?

(フェンダー) 2016/06/17(金) 09:07


VBA からエクスポート定義を追加しても、
いずれの引数とデータ型が対応してませんと
なります。

ではなく
(失礼しました)

有効範囲ではないとなり
エクスポートの定義を保存できないので

実行エラー3625
エクスポート定義が存在しません。
この指定を使用して
インポート・エクスポートは出来ませんとなります。

(フェンダー) 2016/06/17(金) 10:03


 エクスポート定義は、項目数だけ対象テーブル(クエリ)と同じの
 データ数は小数(1行でもOK)のダミーテーブルを作成し、
 それで作ることは出来ませんか?

 ちなみに、対象のテーブルの列数はいくつで、
 エクスポートしたいクエリの列数はいくつでしょうか。
(くろたろう) 2016/06/17(金) 10:38

 対象テーブルをテーブル構造のみでコピーして
 レコードを一件コピペして、各フィールドの文字数を削るのが簡単かと思います。
(くろたろう) 2016/06/17(金) 10:40

対象テーブル列数131
対象クエリ列数131
作業はレコード抽出のみです。

他の列数が多いテストデータでも
チェックしたのですが
どうやら、列数の問題ではなく
1レコードの長さだったようです。

と先程報告したのですが
なぜか
空のテーブルを131用意すると
有効範囲ではないとなり
定義を保存できません。

空のテーブルの列数を128とか少なくして
定義を保存し
DoCmd.TransferText acExportDelim, , "エクスポート定義",

 "ファイル名ク エリ", "C:" & "\" & "ファイル名.csv", True

とすると
エクスポートでき
ダブルクオートなしになりますが
とうぜん
列数128で保存しているので
当然列数128になってしまいます。
(フェンダー) 2016/06/17(金) 11:33


 1フィールド4000が上限っぽいですね。
 フィールドがテキスト型かと思うんですが、そのフィールドサイズを削るといけませんか?
 (使ってないのに255で設定されてるようなら30にする)

 設定と、実際に入ってる文字となんか色々兼ね合いがあるっぽいんですが調べきれてません。
(くろたろう) 2016/06/17(金) 12:29

 ちょっとテストしてみましたが、フィールドのサイズを全フィールド10は出来ても
 9だと「実行時エラー3190・定義されているフィールドが多すぎます」と出てしまい、
 定義がよくわかりません。
 これ以上は私では手におえないため、項目の内容が10文字以内でない場合は
 ???さんご提示の方法等お試し下さい。
 結局役立たずで申し訳ないです。
(くろたろう) 2016/06/17(金) 12:50

(くろたろう)さん
インポートする
前に
文字列の引用符をなしを
保存してみたらと
思い検証してみました。

テーブルをコピーして
空のテーブルを作成する方法ではなく
一度整理をして、
131列数ある生データをテキスト型で
インポート前に
文字列の引用符をなしで保存で
試したら見事解決致しました。

手順方法

1 131列数生データを取り込み
2 文字列の引用符をなしで保存
3 テキスト型でインポート
4クエリ作成

5DoCmd.TransferText acExportDelim, , "エクスポート定義",

 "ファイル名クエリ", "C:" & "\" & "ファイル名.csv", True

上記文
よりダブルクオートなしの抽出データエクスポート
以上になります。
これで安全に大きなデータを
を管理できます。
アドバイス
どうもありがとうございました。

(フェンダー) 2016/06/17(金) 15:43


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.