dポイントプレゼントキャンペーン実施中!

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

A 回答 (4件)

> CSVファイルのサイズは10GB超



これをメモリ上に展開するのは32bit Windowsの制限で無理だし、64bitだとMicrosoft.Jet.OLEDBが動かない。
いずれにしろADOでは無理。

SQLでCSVを検索したいのなら、LogParserとか。
http://www.atmarkit.co.jp/fwin2k/operation/logpa …
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。

集計にあたり、丸ごと展開してくれなくても良いのですが、
そういうわけにもいかないのですかね?詳しくなくてすみません。
最初の回答者にお教えいただいたとおり、Line Inputであれば、
いくら大きいファイルでもあつかえますし。

LogParserについて調べてみます。ありがとうございます。

お礼日時:2012/02/23 09:28

> レコード数などに制限はあるのでしょうか。


停止したときのアクセスのファイルサイズは確認できますか?
バージョン記載がないけど、2003までならMDB、2007以降ならACCDBファイル。
たぶん最大サイズ2GBの上限値に達していると思います。

この回答への補足

Accessは用いておりません。10数GBあるcsvファイルからそのまま、記載したマクロを
用いてデータを抽出しようと考えてました。

いずれにせよ2GBが上限なんでしょうかね。

補足日時:2012/02/23 09:31
    • good
    • 0

テキストファイルで、しかも容量があるなら、


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などを用いて、
条件にあったデータの取得や、データのグループ化などが行えればと思っています。

補足日時:2012/02/22 09:12
    • good
    • 0

行数調べているだけですよね?


だったら普通にOpenしてLine Inputできる
回数を数えたほうが簡単ですよ。
中を見るにしても何でADOなんでしょ?
普通に読み込めばいいじゃないですか。
何か不都合がありますか?

この回答への補足

言葉足らずで申し訳ありません。

データを取得するとき、何かしらの加工を行いたいと思っており、マクロの構文中に
SQL文が書けるのというお話でしたので、ADOを用いています。

Line Inputの場合、SQL文の用い方がわからなかったものです。

補足日時:2012/02/21 20:09
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!