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

投稿時間:2003/12/17(Wed) 19:37
投稿者名:Tomo
Eメール:
URL :
タイトル:
AtEndOfStream について
初めて投稿させて頂きます Tomo と申します。
過去 Log ある程度拝見させて頂きましたが、該当する内容が無い
様でしたので質問させて頂きます。

表題の件でお聞きしたい事があるのですが、Loop の中に Loop を
入れて両方で AtEndOfStream を使用した場合、内側 Loop を抜け
た後(最終行迄読み終わり)外側 Loop により再度内側 Loop に入
った場合、既に最後迄読み終わっている為飛ばされて仕舞います。

    ' 外側 Loop
    Do Until objFile.AtEndOfStream
        ' 1行づつ変数に読み込みます。
        strTextLine = objFile.ReadLine
        fndItem = Array(strTextLine)

        ' 内側 Loop
        Do Until objKey.AtEndOfStream
            fndKey = objKey.ReadLine
            fndItem = Filter(fndItem, fndKey, False, vbTextCompare)
        Loop
            
        For i = LBound(fndItem) To UBound(fndItem)
            Print #intTempNo, fndItem(i)
        Next i
    Loop

処理内容としては、Log File(text) から別の File に記述されている
Keyword 群を含む行を省いて出力する、という物なのですが、上記の
理由により上手く行ってくれませんでした。
何とか原因が分かったので、対処として内側 Loop の手前に

    Set objKey = objKeySystem.OpenTextFile(strKeyFile)

と毎回 Set し直す事で何とか意図した動作を出来る様になりました。

前置きが長くなって仕舞いましたが、お聞きしたい内容というのは
AtEndObStream を繰り返す際、再度最初の行から読み返す様にする
のにもっと良い方法はありませんでしょうか?
この処理をした場合、数 MB 程度のサイズでも結構時間が掛かって
しまうので少しでも早くならない物かと考えてる所です。

投稿時間:2003/12/17(Wed) 20:43
投稿者名:Tomo
Eメール:
URL :
タイトル:
追加質問です
追加ですみませんが、

>         ' 内側 Loop
>         Do Until objKey.AtEndOfStream
>             fndKey = objKey.ReadLine
>             fndItem = Filter(fndItem, fndKey, False, vbTextCompare)
>         Loop

この時、Filter で省かれた時点で Loop を抜けたい場合どうすれば
抜けれますでしょうか?
恐らく配列になっている為だと思いますが、If 文で "" や Null 等
指定して試しましたがエラーになって仕舞い上手くいきません。
弾かれた時点で抜けれれば大分処理を短縮出来そうなのですが。
(Keyword が数百単位になる為)

宜しくお願いします。

投稿時間:2003/12/17(Wed) 20:43
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re: AtEndOfStream について
Keyword ファイルを「配列」に読み込む処理を外側ループの前で行い
ループの中では、配列とLogファイルを比較するようにした方が
よいでしょう。

#なんか久しぶりに書き込んだ〜

投稿時間:2003/12/17(Wed) 21:30
投稿者名:Tomo
Eメール:
URL :
タイトル:
Re^2: AtEndOfStream について
お返事有難う御座います。

> Keyword ファイルを「配列」に読み込む処理を外側ループの前で行い
> ループの中では、配列とLogファイルを比較するようにした方が
> よいでしょう。

という事は、最初に動的配列に Keyword を全て取り込み、
For〜Next 文と Like 文で比較、という事でしょうか。

Keyword が膨大になった際にメモリがきつくなるのでは、
との懸念から都度取得する形にしてみたのですが、Keyword
1000個単位になっても問題無い物でしょうか?
問題無い様なら試してみます。有難う御座います。

投稿時間:2003/12/17(Wed) 23:31
投稿者名:NAO★
Eメール:
URL :
タイトル:
Re^3: AtEndOfStream について
仮にキーワードがすべて10文字程度なら1000件で20〜30KBぐらいしか消費しませんので、
あんまり問題にならないのではないかと思います。
80文字でも160KBぐらいだし。

投稿時間:2003/12/19(Fri) 02:08
投稿者名:Tomo
Eメール:
URL :
タイトル:
Re^4: AtEndOfStream について
何度もすみません、NAO★さんの案を習い色々と試してる
のですが、どうも旨く動作してくれません(涙

Code 乗せさせて頂きますのでどこが間違ってるか教えて頂け
ないでしょうか?

先ず、変数に取り込む所では

    Dim fndKey(1000)    As String
    Dim f               As Integer
    Dim fMax            As Integer

    ' 変数に Keyword を取り込み。Keyword は各半角 10字程度
    f = 0
    Do Until objKey.AtEndOfStream
        fndKey(f) = objKey.ReadLine
        f = f + 1
    Loop
    
    ' Keyword 数取得
    fMax = f

としました。恐らくここは問題無いと思うのですが、その後
文字列を Keyword Check する段で、過去ログも参考にしつつ

    Do Until objFile.AtEndOfStream
                
        ' 検索元 File から 1行づつ変数に読み込み。
        strTextLine = objFile.ReadLine
                
        For f = 0 To fMax   ← 動的変数に入れた Keyword を順次 Check
            If InStr(1, strTextLine, fndKey(f), vbTextCompare) = 0 Then
                              ↑ Keyword が含まれてないのを Check
                fndWord = 1   ← Keyword が含まれて無かったら Flag On
            Else
                fndWord = 0   ← Keyword が含まれてたら Flag Off
                Exit For      ← 処理減らす為に For 抜け
            End If
        Next f
        
        If fndWord <> 0 Then  ← Flag Check
            Print #intTempNo, strTextLine  ← Flag が立っていれば書き出し
        End If
    Loop             ← 以上検索元を読み終わる迄繰り返し


という感じなのですが、全く書き出さないか書き出しても可也
おかしい判定になってしまいます。
Keyword 自体は別ファイルに行毎に Keyword をそのまま書き、
検索元ファイルの中の各行の中に Keyword が全て含まれてない
場合に書き出すという用途なのですが、Keyword が複数という
所で旨くいけてない感じです。
1つの Keyword のみの場合ならば過去ログに有ったのですが。。。

Like 関数ではワイルドカードの部分(?)で旨く動作せず、最初
の Filter だと何とか動作はしますが処理に時間が可也係り、
手詰まりな状態です。
お手数ですが宜しくお願い致します。

投稿時間:2003/12/19(Fri) 02:53
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re^5: AtEndOfStream について
>     f = 0
>     Do Until objKey.AtEndOfStream
>         fndKey(f) = objKey.ReadLine
>         f = f + 1
>     Loop
>    
>     ' Keyword 数取得
>     fMax = f

fMax = f-1  にするか、下記のように変更して見たらどうなるでしょうか。
最後のデータが空で取得されているせいかと思うのですが?
取得後に、fndKey(f) の値を確認して見て下さい。
    f = -1
    Do Until objKey.AtEndOfStream
       f = f + 1
       fndKey(f) = objKey.ReadLine
    Loop

それと、かなりおかしい判定とはどのような事でしょうか?もう少し具体的に
説明して頂かないと判断できないかと思います。
(fndWord = 0 の場合がおかしくなるのか fndWord = 1 の場合がおかしくなるのか等)

場合によっては、 fndKey(f) = Trim(objKey.ReadLine) 等も試して見るとか?

投稿時間:2003/12/19(Fri) 13:31
投稿者名:Tomo
Eメール:
URL :
タイトル:
Re^6: AtEndOfStream について
NAO★さん、花ちゃんさん、有難う御座います。
結果から申しますと、意図した通りに動作するようになりました。

間違ってる所を勝手に合ってると思い込み、実は間違ってない所ばかり
気にしていては何をしても上手く行く筈ありませんね。。。

> fMax = f-1  にするか、下記のように変更して見たらどうなるでしょうか。
> 最後のデータが空で取得されているせいかと思うのですが?

ご指摘の通りでした。最後にカウントアップさせて仕舞っていたが為に
「空で無い場合書き出し」になり全く書き出せてなかったようです。
初歩的なミスでお恥ずかしい・・・(汗

> それと、かなりおかしい判定とはどのような事でしょうか?もう少し具体的に
> 説明して頂かないと判断できないかと思います。

上記のミスが原因に尽きるかとは思いますが、関数自体別の方法を使っ
てみたりしてた時でしたので、明らかにおかしい為に残してませんでし
た。申し訳ありません。以後気をつけます。

本当に有難う御座いました。