ループを抜けるコードは2?


サモエル  2005-06-04 04:26:39  No: 122237

以前、ここで、お世話になりましたサモエルです。
http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200506/05060002.txt

   Cnt = 0

   Do Until EOF(1)
      Line Input #1, S
      If Left(S, 3) = "SET" Then
           i = InStr(S, "=") + 1
           S2 = S2 & Mid(S, i)
           If Cnt = 3 Then Exit Do
        End If
   Loop

上のようなコードを組んでいますが、
すぐにSET行が3行見つかればよいのですが、
何万行もあるときに最後の3行がSETから始まる形式だと、
時間がかかります。

なにかいい方法はないものでしょうか?

宜しくお願い致します。

データはこのような形式でSET行があれば、3行連続してあります。

SET=AAAAA
SET=BBBBB
SET=CCCCC


じゃんぬねっと  URL  2005-06-04 04:53:24  No: 122238

Exit Do


通ってみた  2005-06-04 15:02:37  No: 122239

>>If Cnt = 3 Then Exit Do

とありますが、Cntは一生0だと思います。

ちなみに「SET」が3行必ず繋がっているのであれば、1つめの「SET」をみつけたらもう2回読み込めば処理終了ですね
それならCntというカウンターすらいらないと思われ


ガッ  2005-06-04 18:17:36  No: 122240

んー、ファイルが小さいなら一度に全てを読み込んで、Instr()で検索した法が早いかも。

※サンプルデータがないので、あくまで予想


サモエル  2005-06-04 18:45:59  No: 122241

みなさん回答ありがとうございました。

>If Cnt = 3 Then Exit Do
の前に
Cnt = Cnt + 1
を入れるを忘れてしまいました。

>ファイルが小さいなら
ファイルは大きかったり、小さかったりします。

宜しくお願い致します。


id_rsa+  2005-06-04 20:19:18  No: 122242

あんまり、変わらないカモだけど・・・

>If Left(S, 3) = "SET" Then

If Left$(S, 3) = "SET" Then
(Left$を使う。。)

>i = InStr(S, "=") + 1
>S2 = S2 & Mid(S, i)

S2 = S2 & Mid$(S, 5)
(Mid$を使う+「=」位置を固定。。)

それか、、DAOを使ってSQLを投げる(多分速いと思う・・・)


LESIA  2005-06-04 20:49:04  No: 122243

>>If Left(S, 3) = "SET" Then
>↓
>If Left$(S, 3) = "SET" Then
>(Left$を使う。。)

If S Like "SET*" Then
という方法もありますね。

>>i = InStr(S, "=") + 1
>>S2 = S2 & Mid(S, i)
>↓
>S2 = S2 & Mid$(S, 5)
>(Mid$を使う+「=」位置を固定。。)

この部分は3回しか実行されないので、元のままでもいいかも(^^;


id_rsa+  2005-06-04 21:04:32  No: 122244

Left$よりLikeの方が速いの??知らなかった。ありがと。。


夏の朝も天玉うどん  2005-06-04 21:04:40  No: 122245

>データはこのような形式でSET行があれば、3行連続してあります。

必ず3行連続しているのであれば2行飛ばしで「SET」のある行を
チエックしてゆく手段もあります。これだと3行つづいている「SET」
のある行のうちどれかに必ずかかりますので、そこで終了とすれば
よろしいかと思います。ちょっとは速くなると思います。


Say  2005-06-04 21:23:32  No: 122246

VBでの処理前にgrepでSET行をかき集めておくとか。


LESIA  2005-06-04 21:36:07  No: 122247

> Left$よりLikeの方が速いの??知らなかった。ありがと。。
たしか速かったと思ったけど、もしかしたら勘違いかも(^^;

InStr関数がLikeより速いと書いていたサイトもあったので
LeftとLikeとInStrでどれが一番速いかテストするといいかも。
家のPCにはVBが入ってないので私はテスト出来ませんが(^^;
If InStr(S, "SET") = 1 Then


夏の朝も天玉うどん  2005-06-05 03:05:08  No: 122248

もう一つSET行の使用目的がわからないので何ともいい加減な提案に
なりますが、セット行の登録時にその位置もファイル内(先頭に)に同時
に保存する。
これが最速だと思います。どういう目的・意図でSET行がそこにある
のか、あるいは挿入されるのか等が判れば、アルゴリズムのレベルでの
高速化の解答もいただけるのでは?


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加