[リストへもどる]
一括表示

投稿時間:2004/07/14(Wed) 22:04
投稿者名:けんいち
URL :
タイトル:
バイナリ形式の扱い方について
けんいちといいます。こんにちわ。

バイナリの扱いでおたずねしたいことがあります。
ラインフィールドで改行されているテキストファイルをLine Inputと同じように切り出そうとして、
string形式とバイナリ形式で処理する方法を考えてみました。
両方ともvbLfを見つけたら、検索開始位置からvbLfまでを切り出すというもので、コードは下記の通りです。

おたずねしたいことは、切り出しをするときのスピードについてです。
一般的にバイナリ形式で処理をする方が文字列を扱うより早いと聞いたので試してみたのですが、
以下の方法を比較すると、バイナリで切り出しを行う方が情けないくらい遅いのです。

バイナリ形式で処理をするには、どのような方法が適切(高速)なのでしょうか。
ご教示いただけませんでしょうか。
よろしくお願いします。


'string形式で切り出し:
Private m_File as String    'ファイルをString形式で読み込んだもの
Private m_FileLength as Long    'ファイルの長さ(文字列)
Private m_lngFirst as Long    '切り出しを始める位置
Dim i as Long            '検索位置
Dim LineRead as String        '切り出した文字

    Do Until i + m_lngFirst >= m_FileLength
    'ファイル全体の長さに達するまで実行

      If Mid(m_File, m_lngFirst + i, 1) = vbLf Then

            LineRead = Mid(m_File, m_lngFirst, i - 1)
       '改行コードを無視して、LineReadを別のモジュールに渡す
              
      m_lngFirst = m_lngFirst + i + 1
      '切り出しの開始位置を設定

            Exit Do
      End If

      i = i + 1
    Loop


'バイナリ形式で切り出し
Private m_File() as Byte    'ファイルをString形式で読み込んだもの
Private m_FileLength as Long    'ファイルの長さ(文字列)
Private m_lngFirst as Long    '切り出しを始める位置
Dim i as Long            '検索位置
Dim LineRead as String        '切り出した文字


    Do Until i + m_lngFirst >= m_FileLength

      If StrComp(MidB(m_File, m_lngFirst + i, 1), _
                             ChrB(10), vbBinaryCompare) = 0 Then
      '文字列の時のようにイコール文でやってみたら失敗したので、変更してみた

        LineRead = StrConv(MidB(m_File, m_lngFirst, i), vbUnicode)
      'バイナリを文字列に置き換え、別モジュールに渡す

        m_lngFirst = m_lngFirst + i + 2
        Exit Do

      End If
      i = i + 1
    
    Loop

投稿時間:2004/07/14(Wed) 22:52
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: バイナリ形式の扱い方について
ファイルを丸ごと読み込みSplit 関数で切り出してみては。
AddDat = Split(myString, vbCrLf)

因みに、私のノートパソコン WindowsXP VB6.0 celeron 2.40GHz  496MB RAM の
環境で約5MBの掲示板のログファイル(テキスト形式)
での切り出し(表示部分は除く) 
 0.95 秒でした。

Option Explicit
Private Declare Function timeGetTime Lib "winmm.dll" () As Long

Private Sub Command1_Click()
    Dim lngStartTime As Long
    lngStartTime = timeGetTime
    Dim myString As String
    Dim Fso   As New FileSystemObject
    Dim FsoTS As TextStream
    Set FsoTS = Fso.OpenTextFile("c:\test.log")
    myString = FsoTS.ReadAll
    FsoTS.Close
    Set FsoTS = Nothing
    Dim AddDat   As Variant
    AddDat = Split(myString, vbCrLf)

    Dim i As Long
    Dim LineRead As String
    For i = LBound(AddDat) To UBound(AddDat)
        LineRead = AddDat(i)
    Next i
    Debug.Print (timeGetTime - lngStartTime) / 1000
End Sub

投稿時間:2004/07/15(Thu) 15:45
投稿者名:けんいち
URL :
タイトル:
Re^2: バイナリ形式の扱い方について
ありがとうございました。
また、環境を書き忘れていて申し訳ありません。
Windows2000 VB6.0SP6です。

> AddDat = Split(myString, vbCrLf)

こういった方法は全然考えつきませんでした・・・
本当に処理が速くなりました。

ところで、SplitはVB6.0からの関数だと人から聞いたのですが、
それ以前はどのように処理をするのが定石だったのでしょうか。