Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


43511 / 76732 ←次へ | 前へ→

【38268】Re:テキストファイルの高速読込み
発言  ichinose  - 06/5/30(火) 19:56 -

引用なし
パスワード
   ▼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さんの方法を一度、試してみてください。

4 hits

【38243】テキストファイルの高速読込み aya 06/5/30(火) 15:29 質問
【38244】Re:テキストファイルの高速読込み 06/5/30(火) 15:44 回答
【38245】Re:テキストファイルの高速読込み aya 06/5/30(火) 15:55 発言
【38246】Re:テキストファイルの高速読込み Jaka 06/5/30(火) 16:00 発言
【38247】Re:テキストファイルの高速読込み Jaka 06/5/30(火) 16:07 発言
【38375】Re:テキストファイルの高速読込み aya 06/6/1(木) 9:59 質問
【38249】Re:テキストファイルの高速読込み Kein 06/5/30(火) 16:13 発言
【38376】Re:テキストファイルの高速読込み aya 06/6/1(木) 10:01 発言
【38386】Re:テキストファイルの高速読込み Kein 06/6/1(木) 14:41 回答
【38388】Re:テキストファイルの高速読込み Kein 06/6/1(木) 14:43 発言
【38254】Re:テキストファイルの高速読込み neptune 06/5/30(火) 17:21 回答
【38268】Re:テキストファイルの高速読込み ichinose 06/5/30(火) 19:56 発言
【38287】Re:テキストファイルの高速読込み neptune 06/5/30(火) 23:10 発言
【38288】Re:テキストファイルの高速読込み neptune 06/5/30(火) 23:20 発言
【38377】Re:テキストファイルの高速読込み aya 06/6/1(木) 10:16 質問
【38402】Re:テキストファイルの高速読込み ichinose 06/6/1(木) 23:09 発言
【38378】Re:テキストファイルの高速読込み aya 06/6/1(木) 10:23 質問
【38387】Re:テキストファイルの高速読込み neptune 06/6/1(木) 14:42 回答
【38389】Re:テキストファイルの高速読込み aya 06/6/1(木) 15:50 発言
【38391】Re:テキストファイルの高速読込み neptune 06/6/1(木) 17:54 回答
【38392】Re:テキストファイルの高速読込み neptune 06/6/1(木) 18:52 発言

43511 / 76732 ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free