|
▼neptune さん:
こんばんは。
ちょっと気になったので・・・。
>固定長ファイルなので読み込み自体はランダムアクセスの方が早いはずです。
う〜ん、テキストファイルの順次読み込みは、
Line Inputを使用したほうが
ランダムアクセスよりわずかでも
速いと思いますけどねえ!!
例えば、
'========================================================
Type o_data
f1 As String * 8
f2 As String * 8
f3 As String * 8
f4 As String * 10
f5 As String * 2 'Crlf格納用
End Type
'================================================================
Sub mk_sample()
Dim dat1 As o_data
Dim idx As Long
Open ThisWorkbook.Path & "\sample.txt" For Output As #1
For idx = 1 To 400000
With dat1
.f1 = Format(idx, "00000000")
.f2 = String(8, "a")
.f3 = String(8, "b")
.f4 = String(10, "c")
Print #1, .f1 & .f2 & .f3 & .f4
End With
Next idx
Close #1
End Sub
で固定長のテキストデータを400000件作成します。
尚、Thisworkbook.Pathを使っていますから、一度保存してから実行してください。
Test1
Line Inputで読み込み
'============================================================
Sub readtest1()
Dim dat1 As String
Dim idx As Long
st = Now()
Open ThisWorkbook.Path & "\sample.txt" For Input As #1
Do Until EOF(1)
Line Input #1, dat1
Loop
Close #1
MsgBox Format(Now() - st, "hh:mm:ss") & "-----" & Mid(dat1, 1, 8)
End Sub
Test2
ランダムファイルに見立てて読み込み
'===============================================================
Sub readtest2()
Dim dat1 As o_data
Dim idx As Long
Dim lastrec As Long
st = Now()
Open ThisWorkbook.Path & "\sample.txt" For Random As #1 Len = Len(dat1)
lastrec = LOF(1) \ Len(dat1)
For idx = 1 To lastrec
Get #1, idx, dat1
Next idx
Close #1
MsgBox Format(Now() - st, "hh:mm:ss") & "----" & dat1.f1
End Sub
Readtest1 Readtest2を実行してみてください。
私の環境でReadtest1 4秒 Readtest2 8秒
でした。
>
>これより早く読み込みたいなら、バイナリアクセスで一気に全て読み込み
>全て変数に格納、その後判断などの処理をしていく方法もあります。
これは、賛成ですが、全部読み込むとデータ量を気にしなくてななりませんから、
例えば、
1Kバイト分読み込んで処理
次の1Kバイト分読み込んで処理
というように
OSファイル管理の
バッファーとレコードの関係のようなアルゴリズムにすると
良いと思いますが・・・。
ただ、
ayaさんの問題は、ファイルの読み込みが問題ではなく、
読み込んでからの問題だと思いますけどねえ
Jakaさんの方法を一度、試してみてください。
|
|