・UWSC - クリップボードにコピーしたINIファイルのテキストのキーにセクション名プリフィックスを付加するスクリプト
長いタイトルですが、これは例えば…ふたつの同じセクションとキーを持つ異なるINIファイルをキーでマージする場合に、セクションやキーの順番をあわせるために行ソートする必要が有ったのですが、これを単純にソートしてしまうと、異なるセクション間で同じキー名が有った時に順番が不定になって困る事になります。そこで全てのキーの先頭にセクション名のプリフィックスを付加するために作ったスクリプトです。
UWSCで作るには向かないタイプの処理では有りますが、私はこのような処理をファイルを直接アクセスするのではなく、クリップボードを対象にアクセスするようにする事で、任意のテキストエディタ等からも使えるようにしています。このような処理の場合はUWSCは結構便利です (処理速度は遅いしクリップボードなので大きなサイズでは使い物にならないですが…)。
このスクリプトではメインルーチンで CLASS によるパッケージングを使用しています。UWSCではなんらかのサブ関数を利用したい場合、この方法を使用するとパラメータの渡し方で悩む必要が殆どなくなるので良く使用しています。この例では While ループの中の行処理をループの前で最初に一度だけ行うために Sub という名前のプロシージャにまとめています。 UWSCのクラスは実は本来の名前通りの機能=オブジェクトクラスの定義やインスタンスの作成には全く使えないのですが、このようなパッケージングにはとても便利に使えます。CLASSという名前は変更した方がいいような気もしてます (例えばPACKAGEとか…)。
ファイルをアップロードするほどのものではないのでスクリプトを以下にコピペしますが、例によってこのブログ投稿ではうまくいきません。もし役に立つようでしたら適当に修正して使ってください。
// inifilesectionprefix.uws -
// クリップボードのINIファイルテキストの各行の先頭にセクション名を追加する
// author:
// nullpage 2008-05-20
Class Main
Dim inbuff= GetStr(0) // クリップボードの文字列をコピー
Dim outbuff= ""
Dim line, linet // line buffer, and temp
Dim prefix= ""
Dim lines=0 // 行数 (使ってませんが…)
Procedure Main
If Length(inbuff)<1 Then Exit
Sub()
While Length(inbuff)>0 // 全部の行を処理するまで繰り返す
Sub()
Wend
If lines<1 then Exit
SendStr(0,outbuff) // 実際のクリップボードに反映
Exit
Fend
Procedure Sub()
Balloon.Set("Line:" + lines + " Prefix=[" + prefix + "]")
line= Token(Chr($0A),inbuff) + Chr($0A) // 1行取り出し
linet= line
IfB Pos("[",line)=1 AND Pos("]",line)>2 Then
// Print "Found section=" + line
prefix= BetweenStr(line,"[","]")
outbuff= outbuff + line
ElseIf Trim(token(";"+Chr($0A),linet))="" Then
//Print "Found invaid key line=" + line
outbuff= outbuff + line
Else
outbuff= outbuff + prefix + ":" + line
// Print "Found vaid key line=" + line
EndIf
lines= lines+1 // 行数を数える
Fend
EndClass
Class Balloon
Dim _Wait= 0
Public Wait= 5
Procedure Balloon()
Thread This.Idol()
Fend
Procedure Idol()
While TRUE
Sleep(1)
If _Wait=0 Then Continue
_Wait= _Wait -1
If _Wait=0 Then Fukidasi()
Wend
Fend
Procedure Set(msg)
Fukidasi(msg,G_SCREEN_W,G_SCREEN_H)
x= G_SCREEN_W - Status(GetId(GET_FUKIDASI_WIN),ST_WIDTH)
y= G_SCREEN_H - Status(GetId(GET_FUKIDASI_WIN),ST_HEIGHT)
Fukidasi(msg,x,y)
This._Wait= This.Wait
Fend
EndClass
|
コメント(0)