以前、ここで、お世話になりましたサモエルです。
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
Exit Do
>>If Cnt = 3 Then Exit Do
とありますが、Cntは一生0だと思います。
ちなみに「SET」が3行必ず繋がっているのであれば、1つめの「SET」をみつけたらもう2回読み込めば処理終了ですね
それならCntというカウンターすらいらないと思われ
んー、ファイルが小さいなら一度に全てを読み込んで、Instr()で検索した法が早いかも。
※サンプルデータがないので、あくまで予想
みなさん回答ありがとうございました。
>If Cnt = 3 Then Exit Do
の前に
Cnt = Cnt + 1
を入れるを忘れてしまいました。
>ファイルが小さいなら
ファイルは大きかったり、小さかったりします。
宜しくお願い致します。
あんまり、変わらないカモだけど・・・
>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を投げる(多分速いと思う・・・)
>>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回しか実行されないので、元のままでもいいかも(^^;
Left$よりLikeの方が速いの??知らなかった。ありがと。。
>データはこのような形式でSET行があれば、3行連続してあります。
必ず3行連続しているのであれば2行飛ばしで「SET」のある行を
チエックしてゆく手段もあります。これだと3行つづいている「SET」
のある行のうちどれかに必ずかかりますので、そこで終了とすれば
よろしいかと思います。ちょっとは速くなると思います。
VBでの処理前にgrepでSET行をかき集めておくとか。
> Left$よりLikeの方が速いの??知らなかった。ありがと。。
たしか速かったと思ったけど、もしかしたら勘違いかも(^^;
InStr関数がLikeより速いと書いていたサイトもあったので
LeftとLikeとInStrでどれが一番速いかテストするといいかも。
家のPCにはVBが入ってないので私はテスト出来ませんが(^^;
If InStr(S, "SET") = 1 Then
もう一つSET行の使用目的がわからないので何ともいい加減な提案に
なりますが、セット行の登録時にその位置もファイル内(先頭に)に同時
に保存する。
これが最速だと思います。どういう目的・意図でSET行がそこにある
のか、あるいは挿入されるのか等が判れば、アルゴリズムのレベルでの
高速化の解答もいただけるのでは?
ツイート | ![]() |