
こんにちは。
EXCELのVBAにて巨大なファイルのデータを途中から読み込む方法がございましたらご教授いただきたいと思っています。
具体的には300万行ほどのCSVデータがありまして
たとえば、50万行目のデータを読み込みたい場合下記のようにすることにより、データの取得は可能なのですが、50万行目までSKIPするのに数秒の時間がかかってしまいます。いきなり50万行目からのデータを取得するようなスマートな方法は存在するのでしょうか。
よろしくお願いいたします。
Const ForReading = 1, ForWriting = 2, ForAppending = 3
Dim fs, f
Set fs = CreateObject("Scripting.FileSystemObject")
Set f = fs.OpenTextFile("C:\tmp.csv", ForReading, 0)
For w = 0 To 500000
f.skipline
Next
Debug.Print f.readline
f.Close
No.3ベストアンサー
- 回答日時:
項目1 連番
項目2 名前
項目3 住所
3列の300万行データなら
'=========================
myDIR = "c:\happy"
myCSV = "ADO_EXCEL.csv"
mySQL = "SELECT * FROM " & myCSV & " WHERE 連番='500000'"
'=========================
Set myDB = CreateObject("ADODB.Connection")
myDB.Open "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
"DBQ=" & myDIR & ";" & "ReadOnly=1"
Set myRS = myDB.Execute(mySQL)
Do Until myRS.Eof = True
Msgbox "項目1 連番 :" & myRS(0)
Msgbox "項目2 名前 :" & myRS(1)
Msgbox "項目3 住所 :" & myRS(2)
myRS.MoveNext
Loop
myRS.Close : myDB.Close : Set myRS = Nothing : Set myDB = Nothing
http://www.jtw.zaq.ne.jp/kayakaya/new/kihon/text …
http://itpro.nikkeibp.co.jp/article/COLUMN/20070 …
http://itpro.nikkeibp.co.jp/article/lecture/2006 …
Excelで扱うことができる限界は
シートの行数が決めるのではありません
使う人の知識がExcelでできることを決定します
Excel2000でも100万件データを扱うことはできます
シートを使わずデータ処理を行うブックもあります
質問者は シートの行数を問題にしていません
シーケンシャルであることも条件にしていません
できる できない は知識によって違います
最短 最適 は別の条件もあります
この回答への補足
大変的確な回答ありがとうございます!
まさに求めていた手法でした。
CSVにもSQLを使うことができるんですね。知りませんでした。
これは大変便利です。しかもかなり高速に動作しました。
私の利用したいCSVにはヘッダーが存在しませんでしたので、少し調べてみました。
HDR=No と指定することにより、フィールドをF1、F2などとして利用できると書いてあったのですが
Microsoft Text Driver では正常に動作しませんでした。
Microsoft.Jet.OLEDB.4.0 を利用することにより動作しました。
参考まで正常に動作したコードを書いておきます。
'=========================
myDIR = "C:\temp"
myCSV = "test.csv"
mySQL = "SELECT TOP 2 * FROM " & myCSV & " WHERE F2 = '4034';"
'=========================
Set rs = CreateObject("ADODB.Recordset")
Con = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & myDIR & ";" & _
"Extended Properties=""text;HDR=No;FMT=Delimited;"";"
rs.Open mySQL, Con, 0
Do Until rs.EOF = True
MsgBox "項目1 :" & rs(0)
MsgBox "項目2 :" & rs(1)
rs.MoveNext
Loop
rs.Close: Set myRS = Nothing
No.2
- 回答日時:
SQLを使うことで 目的のレコードを抽出することができます
できれば レコードにそれぞれ最初から連番を付けて
その連番で50万行目を呼び出せば 1件だけ表示できます
この方法なら他の条件での検索もできるので便利です
分からなければ サンプルを用意します 補足してください
No.1
- 回答日時:
エクセルと言っているが、エクセルやエクセルVBAと関係を持たせるのは無理です。
たとえ2007でも。制限行数をオーバーしてます。エクセルだから早くできるかも知れないと想像するとことは、ディスクの読み書きの早さで、MS社のエキスパートだから特別のテクニックを弄していると思うのかもしれないが、不明です。
ですからプログラムはVBでの方法ということになるが、CSVファイルはレコード(各行に当たる)長が一定している保証はないので、順次読むしかなく、50万件目から、あるいは番号500001から処理をいきなり始めるなど絶対無理です。
前もって固定長でランダム読み出しのファイル形式の場合は、可能です。
後尾にスペースを無理に持たせて一定長のレコードを作る手はあるかもしれないが、まあそうはしませんね。
ーー
アクセスでも、「量的に」可能かどうかわかりませんが、エクセル
VBAより可能性はありそう。
ーー
シーケンシャル読み出し
ランダム読み出し
ファイル構造
各種データベース
などを勉強して考えてください。
ーー
時代につれ、ディスクの読み取りスピードアップがなされ、それが寄与するが、今日明日のことにならない。
ーー
50万行を即時に処理し無ければならない業務とはどんなものかな。
>数秒の時間がかかってしまいます
数秒ですむというのも信じがたいが、それが辛抱できないのでしょうか。
何か初心者が思いついた一本線のロジックでつっ走っているような
印象なんだが。
ディスクからメモリに読み込まないと50万件目はわからないし、
CSVファイルは、順読み出ししか方法がないし、VBなど言語やデータ処理ソフトの中でも、質問の方法は単純で早い方法とおもう。
ーー
この処理はどういう場面で出てくるのか、問い合わせの都度か、分析などして数回限りで終るのか書いてないのも、前もって別ファイルを処理できる機械が与えられるのか書いてないのも片手落ちです。
ただし
繰り返し問い合わせなどがあるので、前もって検索などに適したファイル構造にCSVを変換しておき
(1)前もって時間を使いー>問い合わせ時に回答が早い
その回はデータは全体の1単位しか使わない。
(2)1回・数回限り
(3)定例バッチ処理(応答・完了処理に時間を取れる)
データは通常全部を対象にする。
(4)毎回CSVファイルから処理する
などあるが、(1)はデータベースソフトを使って、プロの領分です。
ご回答ありがとうございます。
imogasi様のご回答では「絶対無理」とのことでしたが、他の方が的確な回答をしてくださいました。
後学のためご参考にされることをお勧めします。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) VBAが止まります。 2 2022/09/02 14:02
- Visual Basic(VBA) 複数のcsvファイルをExcelに一括変換したい 2 2023/03/03 12:44
- その他(プログラミング・Web制作) pythonでクラスで複数のメソッドを利用する方法 2 2022/04/15 04:17
- Excel(エクセル) PowerQueryに詳しい方教えてください(Office365) 1 2022/07/24 21:11
- Excel(エクセル) VBA フォルダ見える化のコードについて 2 2023/06/19 15:04
- その他(プログラミング・Web制作) Pythonで、データファイルと列名ファイルを1つのファイルにしたいです。 1 2023/07/27 20:29
- Visual Basic(VBA) VBAでの共有パスにつきまして 1 2023/03/04 17:24
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Visual Basic(VBA) データベースから絞り込んでデータを読み込み 1 2023/02/21 19:51
- その他(Microsoft Office) マクロVBAについて 1 2022/09/06 18:12
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現に関して
-
WEBサイトを、一部動的に表示す...
-
perlにて2つのファイル比較
-
外部サーバーにあるファイルを...
-
ページ間での変数の受け渡し
-
対比較データを表データに変換
-
どのようなプログラムをつくれ...
-
perl で作成された文書と知るに...
-
データ項目の並び替えについて
-
フォルダに入っているファイル...
-
番号をつける
-
2つ質問があり、まず1つ目な...
-
perlでの三次元配列の作り方
-
Perlでのforeach文の挙動がわか...
-
ディレクトリー内のリスト出力...
-
レコードの書込み判断
-
cgiでdocument.writeの書き出し
-
パラメーターについて
-
Perl→exe
-
ListBoxのデータを高速でファイ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
MATLAB グローバル変数の宣言
-
openした後、closeしないでプロ...
-
ExcelをCSV書き出す場合のシー...
-
ReadLineでの読み出し行を指定する
-
VB6.0でDB接続する際に切断時の...
-
Perlの変数に文字数制限(容量...
-
JavaでCSVファイルを高速に読む...
-
VBAで巨大なファイルの途中から...
-
C言語でのファイルのデータ更...
-
C#でCSVファイルを逐一更新したい
-
perl内でPHPを動かす?
-
CSVファイルの内容を編集する方...
-
指定行データの取得
-
CSV出力に関して
-
拡張子 ”log” と ” dat” の違い
-
open( ) の読み込み量
-
ファイル内の日付から1週間前...
-
perlについて、教えてください。
おすすめ情報