忍者ブログ

テキストファイルを開くスピード

2020年03月21日
仕事でログの調査をするとき、
ログファイルのサイズが100MBあったりする。

otabeditで開けないこともないけど、
小さいファイルにまとめようと切り貼りしていると
メモリ不足の警告が出る。めんどくさ。


必要な情報は大したことないので、
欲しい内容をマクロで取り出そうかと。


今回は、本題に入る前にテキストファイルの読み込み速度について、
こんな記事をみつけて早速試してみた。


VBA テキストファイルの最も高速な読み込み方法

・OpenステートメントのBinaryモードにより一括バイナリ読み込み、Unicode変換が最も高速という結果になりました。
 まぁ当然ですね。配列化も簡単なので今後はこれをメインに使っていこう。

出展元
http://tetsucom.blogspot.com/2011/03/vba_9799.html



でかいテキストファイルがないので、
Dドライブの全ファイル、フォルダを書き出して作った。

コマンドプロンプトから
Dir /S D: > フルネーム.txt

ファイルのフルネームは、当該ファイルをコピーして
ファイル名を指定して実行のウィンドウにペーストすると出てくる。


出力結果は3Mぐらい。ちょっと小さめだけどまあいいか。

ついでにCドライブも試したら、10MB。


実行結果(10MB)
TextFileToBuf :2.0009765625
Line    :0.00390625
binary :0.154296875

実行結果(3MB)
TextFileToBuf :0.716796875
Line    :0.0009765625
binary :0.0654296875
記事に書いてあったバイナリよりも
1行ずつ読み込むLineInputのほうが圧倒的に早かった。むー。

【3/23追記】
54,618kBのファイルで再試験したところ、バイナリが最速でした。
TextFileToBuf :33.6
Line    :645.9
binary :6.2

以下、ソース。


Option Explicit
Sub Main()
    'ファイル選択ダイアログでファイルを指定
    Dim vFilePath As Variant, buf As String
    vFilePath = Application.GetOpenFilename
    Dim tictoc As Double
    tictoc = Timer
    buf = TextFileToBuf(vFilePath)
    Debug.Print "TextFileToBuf :" & Timer - tictoc
    tictoc = Timer
    buf = txtファイル読み込み_LineInput(vFilePath)
    Debug.Print "Line :" & Timer - tictoc
    tictoc = Timer
    buf = txtファイル読み込み_binary(vFilePath)
    Debug.Print "binary :" & Timer - tictoc
    
End Sub
Function ファイル名()
        Dim vFilePath As Variant
    vFilePath = Application.GetOpenFilename
ファイル名 = vFilePath
End Function
Function TextFileToBuf(FullName) As String
    Dim buf As String
    With CreateObject("Scripting.FileSystemObject")
        With .GetFile(FullName).OpenAsTextStream
            buf = .ReadAll
            .Close
        End With
    End With
    TextFileToBuf = buf
End Function
Function txtファイル読み込み_binary(vFilePath)
    If vFilePath = False Then
        txtファイル読み込み_binary = ""
    End If
    'ファイルサイズが0バイトの場合も処理終了
    Dim nFileLen As Long
    nFileLen = FileLen(vFilePath)
    If nFileLen = 0 Then
        txtファイル読み込み_binary = ""
    End If
    '指定されたファイルを取得したファイル番号としてバイナリモードで開く
    Open vFilePath For Binary As #1
    'ファイルサイズ分のバイト配列を用意
    Dim bData() As Byte
    ReDim bData(0 To nFileLen - 1)
    'バイト配列に指定ファイルを展開
    Get #1, , bData
    Close #1
    
    txtファイル読み込み_binary = StrConv(bData(), vbUnicode) 'Unicodeに変換
End Function
Function txtファイル読み込み_LineInput(vFilePath)
    If vFilePath = False Then
        txtファイル読み込み_LineInput = ""
    End If
    'ファイルサイズが0バイトの場合も処理終了
    Dim nFileLen As Long
    nFileLen = FileLen(vFilePath)
    If nFileLen = 0 Then
        txtファイル読み込み_LineInput = ""
    End If
    
    Dim buf As String, TextLine As String
    '指定されたファイルを取得したファイル番号としてバイナリモードで開く
    Open vFilePath For Input As #1
    Line Input #1, TextLine
        buf = buf & TextLine
    Close #1
    
    txtファイル読み込み_LineInput = buf
End Function

PR
Comment
  Vodafone絵文字 i-mode絵文字 Ezweb絵文字