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

投稿時間:2003/06/02(Mon) 18:19
投稿者名:nami
Eメール:
URL :
タイトル:
ファイルより最終行のみ所得したい
お世話になります。
ファイルの最終行のみ所得したいと思っています。
現在はファイルをオープンして一行目からずっと参照していき最終行を参照
しています。
この場合だとファイルサイズが大きくなったりすると非効率のような気がし
ます。そこで簡単に最終行のみとってくる方法などはないでしょうか?
皆様、ご教授よろしくお願いします。

投稿時間:2003/06/02(Mon) 18:57
投稿者名:世話人
Eメール:
URL :
タイトル:
Re: ファイルより最終行のみ所得したい
> 現在はファイルをオープンして一行目からずっと参照していき最終行を参照
> しています。
> この場合だとファイルサイズが大きくなったりすると非効率のような気がし
> ます。そこで簡単に最終行のみとってくる方法などはないでしょうか?

普通のシーケンシャルファイルでは仕方が無いのでは。
バイナリーで一気読みしてvbCRLFで分割して配列添え字の
最大の中身を読み込むとか。
ランダムファイルで読み書きするとか。

投稿時間:2003/06/02(Mon) 19:08
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: ファイルより最終行のみ所得したい
ここの FileSystemObject関係 の テキストファイルの指定行を瞬時に読込む を見て下さい。
又、逆引きヘルプにも テキストファイルの最後の数行を取得する ゆう(U)さん投稿分  (075)
があります。

投稿時間:2003/06/02(Mon) 20:25
投稿者名:Lantern
Eメール:
URL :
タイトル:
Re: ファイルより最終行のみ所得したい
バイナリで開いて高速読み込みしてみました。

    Dim sf As String
    Dim ff As Integer
    Dim sBuf As String
    Dim bBuf() As Byte  '読み込み用バイト配列
    Dim lLen As Long    'ファイル長
    Dim lPos As Long    '現在位置用
    
    sf$ = "C:\Test001.txt"
    ff% = FreeFile()

    Open sf$ For Binary Access Read As #ff%
        ReDim bBuf(1) As Byte   '2Byte配列
        lLen& = LOF(ff%)        'ファイルバイト長
        Seek #ff%, lLen& - 2    '最後尾-2にシーク
        Get #ff%, , bBuf()      '2Byte読み込みし、CrLfと比較
        If StrComp(StrConv(bBuf(), vbUnicode), vbCrLf, vbBinaryCompare) = 0 Then
            lLen& = lLen& - 2   'CrLfの場合さらに-2
        End If
        lPos& = lLen& - 2&
        Seek #ff%, lPos&        '最後尾-2にシーク
        Get #ff%, , bBuf(): lPos& = lPos& + 2&      '2Byte読み込みと現在位置更新
        Do Until StrComp(StrConv(bBuf(), vbUnicode), vbCrLf, vbBinaryCompare) = 0
            lPos& = lPos& - 3&  '更に1Byte前へシーク
            Seek #ff%, lPos&
            Get #ff%, , bBuf(): lPos& = lPos& + 2&  '2Byte読み込みと現在位置更新
        Loop
        'CrLf以降を読み込む
        ReDim bBuf(lLen& - lPos& - 1&) As Byte
        Get #ff%, , bBuf()
        sBuf$ = StrConv(bBuf(), vbUnicode)
    Close #ff%

最後尾−2(CrLfの場合は−4)にシークし、2バイトづつ読み込み
CrLfと比較しながら1Byteづつ前にシークしていきます。
ファイルサイズにほとんど影響なく動作すると思います。

投稿時間:2003/06/02(Mon) 21:10
投稿者名:nami
Eメール:
URL :
タイトル:
ありがとうございます。
回答をくださった皆様ありがとうございます。
勉強になりました。
もう少し自分で検索できる方法を覚えていきます。
これからもよろしくお願いします。