
EXCELVBAを用いて、ADODB.CONNECTIONによりデータを取得しようと思い、ネットで調べた
プログラムを使ってみたのですが、途中のレコードまでしか取得できませんでした。
ちなみに、データを取得しようと思っているもとのCSVファイルのサイズは10GB超、レコード数は
800万行程度あります。
これが、数十MB程度のファイルだと問題なかったのですが、レコード数などに制限はあるのでしょうか。
ご教示いただけますと幸いです。
用いたマクロの構文は以下のとおりです。
Dim con As New ADODB.Connection
Dim connectionString As String
Dim csvFilePath As String
Dim rs As ADODB.Recordset
Dim colNo As Long
Dim fileNumber As Long
Dim Buffer As String
'CSVファイルが置かれているフォルダ
csvFilePath = E:\
connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
& "Data Source=" & csvFilePath & ";" _
& "Extended Properties=""Text;HDR=NO;FMT=Delimited"""
'コネクションオープン
con.Open connectionString
'ここでSQL文によりレコードを取得します。
Set rs = con.Execute("SELECT COUNT(*) FROM XXX.CSV")
fileNumber = FreeFile
Open OutputFolder & Application.PathSeparator & OutputFile For Output As #fileNumber
Buffer = ""
’ヘッダーの出力
For colNo = 0 To rs.Fields.Count - 1
If Buffer <> "" Then
Buffer = Buffer & ","
End If
Buffer = Buffer & rs.Fields(colNo).Name
Next
Print #fileNumber, Buffer
’データの出力
Do While rs.EOF = False
Buffer = ""
For colNo = 0 To rs.Fields.Count - 1
If Buffer <> "" Then
Buffer = Buffer & ","
End If
Buffer = Buffer & rs.Fields(colNo).Value
Next
Print #fileNumber, Buffer
'次のレコード
rs.MoveNext
Loop
Close #fileNumber
'クローズ
con.Close
Set rs = Nothing
Set con = Nothing
End Sub
No.3ベストアンサー
- 回答日時:
> CSVファイルのサイズは10GB超
これをメモリ上に展開するのは32bit Windowsの制限で無理だし、64bitだとMicrosoft.Jet.OLEDBが動かない。
いずれにしろADOでは無理。
SQLでCSVを検索したいのなら、LogParserとか。
http://www.atmarkit.co.jp/fwin2k/operation/logpa …
ご回答ありがとうございます。
集計にあたり、丸ごと展開してくれなくても良いのですが、
そういうわけにもいかないのですかね?詳しくなくてすみません。
最初の回答者にお教えいただいたとおり、Line Inputであれば、
いくら大きいファイルでもあつかえますし。
LogParserについて調べてみます。ありがとうございます。
No.4
- 回答日時:
> レコード数などに制限はあるのでしょうか。
停止したときのアクセスのファイルサイズは確認できますか?
バージョン記載がないけど、2003までならMDB、2007以降ならACCDBファイル。
たぶん最大サイズ2GBの上限値に達していると思います。
この回答への補足
Accessは用いておりません。10数GBあるcsvファイルからそのまま、記載したマクロを
用いてデータを抽出しようと考えてました。
いずれにせよ2GBが上限なんでしょうかね。
No.2
- 回答日時:
テキストファイルで、しかも容量があるなら、
ADOで読み込む理由は無いと思いますよ。
★レコード数を知りたい場合
Dim レコード数 As Long
Dim ファイル番号 As Long
Dim データ As String
'空いているファイル番号を取得する
ファイル番号 = FreeFile
'ファイルを開く
Open "~\xxx.csv" For Input As ファイル番号
'EOFになるまで行単位で読み込む
Do Until EOF(ファイル番号)
Line Input #ファイル番号, データ
レコード数 = レコード数 + 1
Loop
'ファイルを閉じる
Close ファイル番号
★データをカンマで区切る
Dim 項目配列 As Variant
Dim 個別要素 As Variant
項目配列 = Split(データ, ",")
For Each 個別要素 In 項目配列
Debug.Print 個別要素
Next
この回答への補足
ご回答ありがとうございます。
テキストファイルからデータの取得を行いたいと思っており、できればSQLなどを用いて、
条件にあったデータの取得や、データのグループ化などが行えればと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
JavaでCSVファイルを高速に読む...
-
MATLAB グローバル変数の宣言
-
VBAでCSVファイルを途中行まで...
-
Perlの変数に文字数制限(容量...
-
openした後、closeしないでプロ...
-
ReadLineでの読み出し行を指定する
-
エディットボックスの表示方法...
-
@の配列変数ではなく$のスカラ...
-
パスから最後のディレクトリだ...
-
drtファイルはどうしたら開...
-
Perl cgiの文字化けを直したい ...
-
正規表現で、特定のファイル名...
-
C言語で特定の行を抽出する方法...
-
ディレクトリ内のtxtファイル中...
-
batファイルでrenameができませ...
-
awkスクリプトでダブルクォーテ...
-
【Access2003】VBAでタブ区切り...
-
WindowsでPerlをする際,1行目の...
-
Edge スクレイピング
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
ExcelをCSV書き出す場合のシー...
-
MATLAB グローバル変数の宣言
-
ReadLineでの読み出し行を指定する
-
ファイルからある文字列の個数...
-
openした後、closeしないでプロ...
-
DBMとハッシュ
-
Perlの変数に文字数制限(容量...
-
JavaでCSVファイルを高速に読む...
-
2つのCSVファイルをマッチング
-
Shift-jisで正規表現
-
リストボックスから選択、結果...
-
C言語でのファイルのデータ更...
-
perlでのクローリングについて
-
パーミッションについて
-
VB6.0でDB接続する際に切断時の...
-
ファイル入出力のタイミング
-
STDINから何度も読み込むことは...
-
CGIからPHPへデータを渡したい
おすすめ情報