テキストファイルの読込表示 |
テキストファイルの読込表示比較 (161) | |
使用する前に、[プロジェクト]→[参照設定]で Microsoft Scripting Runtime
の参照にチェックを入 れておいて下さい。 そして Form に CommandButton3個とLabel1個とRichTextBoxを1個貼り付けておいて下さい。 |
|
Option Explicit 'SampleNo=161 WindowsXP VB6.0(SP5) 2002.07.03 Private Declare Function timeGetTime Lib "winmm.dll" () As Long Private TxtFile As String Private Sub Form_Load() ’別途テキストファイルを用意しておいて下さい。 TxtFile = App.Path & "\Test.Txt" End Sub Private Sub Command1_Click() Label1.Caption = "" RichTextBox1.Text = "" DoEvents fTimeCount Dim Fso As New FileSystemObject Dim FsoTS As TextStream Set FsoTS = Fso.OpenTextFile(TxtFile) 'ファイル全体を読み込みテキストボックスに表示 RichTextBox1.Text = FsoTS.ReadAll 'オープンしていたファイルを閉じる FsoTS.Close Set FsoTS = Nothing DoEvents Label1.Caption = fTimeCount End Sub '====================以下参考=============================== Private Sub Command2_Click() 'Line Input # ステートメントを使っての1行づつ読込 '時間が非常に掛かるので注意 RichTextBox1.Text = "" Label1.Caption = "" DoEvents fTimeCount Dim TxtLine As String Dim MyString As String Dim lngFileNo As Long lngFileNo = FreeFile Open TxtFile For Input As #lngFileNo Do Until EOF(lngFileNo) Line Input #lngFileNo, TxtLine MyString = MyString & TxtLine & vbCrLf Loop Close #lngFileNo RichTextBox1.Text = MyString DoEvents Label1.Caption = fTimeCount End Sub Private Sub Command3_Click() 'テキストファイルをバイナリデータとして読込表示する RichTextBox1.Text = "" Label1.Caption = "" DoEvents fTimeCount Dim bytArray() As Byte Dim intFileNo As Integer Dim lngFileLenB As Long lngFileLenB = FileLen(TxtFile) ReDim bytArray(lngFileLenB - 1) '使用可能なファイル番号を取得する intFileNo = FreeFile 'ファイルをバイナリモードで開く Open TxtFile For Binary As #intFileNo 'バイナリデータとして読込んで Get #intFileNo, , bytArray Close #intFileNo 'Unicodeに変換して表示 RichTextBox1.Text = StrConv(bytArray, vbUnicode) Label1.Caption = fTimeCount End Sub Private Function fTimeCount() As String Static lngST As Long If lngST = 0& Then lngST = timeGetTime Else fTimeCount = "経過時間=" & _ Str$((timeGetTime - lngST) / 1000) & " 秒です" lngST = 0& End If End Function |
|
FileSystemObjectを使ってテキストファイルを読込むからには何かメリットがなければ使 う意味が無いので、読込速度を比較して見ました。 その他 Input # ステートメント を使って読込めば結構高速に読込めるのですが、文中に ”” 等が 使用されているとそれ以降は読込めないので、Line Input を使った読込比較を行っております。 比較結果 約1Mの掲示板のログのテキストファイルを使用 FileSystemObject の場合 約 2.67秒 Line Input の場合 約10分(フリーズしたとカン違いしないように) バイナリの場合 約 2.63秒 上記の結果シンプルなコードで高速にファイル読込ができる事が解って頂けるかと思います。 |
|
お断り Line Inputが遅いのではなく、MyString = MyString & TxtLine & vbCrLf の処理が遅いだけだと言ったような、ご指摘を受ける事があるのですが、上記コード比較は、ファイルの読み込み処理速度の比較を目的に書いたものではありません。 FileSystemObject の紹介の一環としてファイルの通常の読み込み操作の比較をしたものです。 従って、このようにすればファイルが高速に読み込みできると言った事を説明しているものではありませんので誤解なきように、尚、ファイルの高速読み込み等はその使用条件・環境・個人の考え方等々で色々違ってくるので、その場面、場面で考える必要があるかと思います。 (参考 文字列連結の高速化 - まんたろー 06/10-19:11 No.9220) たとへば、数行程度のファイルならどのような読み込み操作でも使用している人には遅い、早いの区別はできないでしょう。コード上で測定しても多分優劣が付かないのでは(測定誤差範囲内では) |
2005/02/22