[[20230824142325]] 『巨大CSVファイルの読み込み方法(UTF-8BOM無)』(モゲラ) ページの最後に飛ぶ

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

 

『巨大CSVファイルの読み込み方法(UTF-8BOM無)』(モゲラ)

 Office365 32bitで10Gを超えるCSVファイルから指定の文字列を含む行の文字列を取得しようとしています
 エンコード方式がUTF-8なためADODB.Streamを使用してファイルを読み込もうと思いましたがメモリ不足でエラーとなってしまいます
 ファイルを分割する以外で何か良い方法はありませんか?

    Set stm = CreateObject("ADODB.Stream")
    Public Sub OpenTextFile)
        Call OpenFile("c:\hoge\bigdata.csv", 2, "utf-8")
    End Sub
    Private Sub OpenFile(path As String, adType As Integer, Optional CharacterCode As Variant)
        If stm.State = 0 Then
            file_path = path
            With stm
                .Open
                .Type = adType
                If Not IsMissing(CharacterCode) Then
                    .Charset = CharacterCode
                End If
                .LoadFromFile file_path    '<-- ここでエラー
            End With
        Else
            Err.Raise 1001, "Open", "Opened File."
        End If
    End Sub

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


Windowで大容量のテキストファイルを扱うときはPowerShellがおすすめ - 適材適所
https://www.tekizai.net/entry/powershell_bigdata_1
                                                        ...だそうです。

(白茶) 2023/08/24(木) 14:56:02


 Size プロパティ (ADO Stream)
https://learn.microsoft.com/ja-jp/office/vba/access/concepts/miscellaneous/size-property-ado-stream

 ストリームのSizeプロパティがLong型の時点で、
 4Gbyte以上のファイルは無理なんじゃないかなぁと思います。

 フィルタを掛けながら読み込むのであれば
 PowerQuery も使えます。Encodeも指定できます
 ですが、多分遅いです
(´・ω・`) 2023/08/24(木) 15:44:00

 そうですか
 今CreateFile関数とReadFile関数を使用して読めないものか試行してますがこれダメだったらPowerShellでも叩いてみます
(モゲラ) 2023/08/24(木) 15:51:13

選択肢としてEmEDitorで検索するとかでは ?

EmEditor は、 Windows 用テキストエディター、コードエディター、CSVエディター、巨大ファイルエディターです

64 ビット版 EmEditor では、メモリが許す限り、
16 TB (17,592,186,044,415 バイト) または 1.09 兆行 (1,099,511,627,775 行) までのファイルを開けるようになりました。

以下参照

もう「Excel」はいらない? 
最強CSVエディターと化した「EmEditor」を使いこなす
https://forest.watch.impress.co.jp/docs/special/1010667.html
(8月の蝉) 2023/08/24(木) 16:44:29


 恒常的に取得したデータを更に加工したりいろいろしたりするものを作りたいので
 外部から扱えない限り他のエディタを使用するのは手間がかかりそうなので選択肢としては薄いです(それならPowerShellで抽出したデータを作成するマクロ組むので・・・)
(モゲラ) 2023/08/24(木) 16:55:43

214,748,363行 × 7列

214740001,2023 6 17,うどん,600,17,10200,35680
214740002,2023 6 17,ラーメン,800,47,37600,59600
214740003,2023 6 17,餃子,500,76,38000,38383
214740004,2023 6 17,ご飯,250,80,20000,58580
214740005,2023 6 17,そば,700,39,27300,29877
214740006,2023 6 17,そば,700,21,14700,29877
214740007,2023 6 17,餃子,500,65,32500,38383
214740008,2023 6 17,餃子,500,76,38000,38383
214740009,2023 6 17,餃子,500,75,37500,38383
214740010,2023 6 17,そば,700,29,20300,29877
214740011,2023 6 17,そば,700,38,26600,29877

な感じのcsv 約9.5ギガバイト[作るの大変でした、c#でdll作成、エクセルからの処理時間、5分]

Shellで1万行毎に分割してみました。^^;
そのぉ出来るのは出来ましたが2時間半ほどPC。。。うなっていました
(*^^*)

21476ファイル出来てました。。。ガ〜ン\(◎o◎)/!
win10 メモリー 8GB
でした。m(__)m

やりかたが、悪かったのだろうかしら。。。^^;
他に良い方法を発見されたのでしたら是非教えて下さいませ。^^
m(__)m
(隠居Z) 2023/08/27(日) 13:21:12


 私は45行くらいを抽出して出力するだけでしたが5分もかからず終わりました
 CreateObject("WScript.Shell").Run "powershell -NoLogo -ExecutionPolicy RemoteSigned -Command " _
        & "Get-Content -Encoding UTF8 'C:\temp\BigData.csv' | Select-String -pattern '.*hoge.*' | Set-Content 'c:\temp\result.csv'", 0, True

 あとは出力されたデータを取得して加工して使っています
(モゲラ) 2023/08/28(月) 14:32:53

こんばんわ。。。^^
解決されたみたいで、良かったです。(*^^*)v

パイプをつなぎ合わせて、. hoge. を含むものだけ抽出
されておられるのでせうか。

コードのご提示ありがとう御座います。折角ですので
再度テスト&研究を後学のため、頑張ってみます。
ありがとう御座いました。m(__)m
(隠居Z) 2023/08/28(月) 19:12:19


コメント返信:

[ 一覧(最新更新順) ]


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