
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ランキング
-
JavaでCSVファイルを高速に読む...
-
Perl Vlookupみたいに
-
VBAでCSVファイルを途中行まで...
-
VB6.0でDB接続する際に切断時の...
-
openした後、closeしないでプロ...
-
検索ボックスから製品名を検索...
-
Windowsで複数のファイルを同じ...
-
FindFirstFileとFindNextFileで...
-
DOSコマンドで、標準出力を出力...
-
パスから最後のディレクトリだ...
-
drtファイルはどうしたら開...
-
Perl 時間同士の差
-
C++でのテキストファイル読み込...
-
空白文字 \\f と\\v の違いに...
-
テキストファイルから日本語部...
-
C言語で特定の行を抽出する方法...
-
タブの色を変更する方法
-
chdirがうまくできない
-
awkスクリプトでダブルクォーテ...
-
エラーログ「\\x8ew\\x92\\xe8...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
ExcelをCSV書き出す場合のシー...
-
エクセルVBA コードが同じでも...
-
VBAでCSVファイルを途中行まで...
-
ReadLineでの読み出し行を指定する
-
VBAで巨大なファイルの途中から...
-
VB6.0でDB接続する際に切断時の...
-
MATLAB グローバル変数の宣言
-
openした後、closeしないでプロ...
-
CSVが可変長の場合の検索方法
-
データファイルの行を削除する
-
5行おきに5行ずつ抽出するに...
-
データファイルをプロットする(...
-
Perlの変数に文字数制限(容量...
-
拡張子 ”log” と ” dat” の違い
-
【VBA】複数のエクセルファイル...
-
JavaでCSVファイルを高速に読む...
-
CGI(Perl)でWeb上から作成...
-
検索ボックスから製品名を検索...
-
CSVファイルの内容を編集する方...
-
ADOによるCSVファイルからのデ...
おすすめ情報