テキストファイルを開くスピード
2020年03月21日
仕事でログの調査をするとき、
ログファイルのサイズが100MBあったりする。
otabeditで開けないこともないけど、
小さいファイルにまとめようと切り貼りしていると
メモリ不足の警告が出る。めんどくさ。
必要な情報は大したことないので、
欲しい内容をマクロで取り出そうかと。
今回は、本題に入る前にテキストファイルの読み込み速度について、
こんな記事をみつけて早速試してみた。
まぁ当然ですね。配列化も簡単なので今後はこれをメインに使っていこう。
出展元
http://tetsucom.blogspot.com/2011/03/vba_9799.html
でかいテキストファイルがないので、
Dドライブの全ファイル、フォルダを書き出して作った。
コマンドプロンプトから
Dir /S D: > フルネーム.txt
ファイルのフルネームは、当該ファイルをコピーして
ファイル名を指定して実行のウィンドウにペーストすると出てくる。
出力結果は3Mぐらい。ちょっと小さめだけどまあいいか。
ついでにCドライブも試したら、10MB。
実行結果(10MB)
1行ずつ読み込むLineInputのほうが圧倒的に早かった。むー。
【3/23追記】
54,618kBのファイルで再試験したところ、バイナリが最速でした。
以下、ソース。
ログファイルのサイズが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)
実行結果(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