|
いであるさん,こんばんは。
》 ここからさらに、複数ファイルをまとめて扱えるようになれば、私のほしい
》機能になるのですが、どうやら複雑なようですね。
別のところで発言されているように,linknext を用いれば簡単ですが,その
ためには対象ファイルを全部開く必要がありますね。
開かないでフォルダ内の全置換をやるように作ってみました。
なお,このバージョンではリストの書き方を少し変えて,通常置換と,正規表
現による置換が混在できるようにしてみました。そのために,区切りは半角のコ
ンマに限定しています。
正規表現の場合は末尾に "r" か "regular"を付加してください。
[例]
あ,ア
い,イ
う,ウ
[a-d],x,r
え+,エ,regular
何かお気づきのことありましたら,コメントください。
では, (^^)/~
//------------------------------------------------------------------//
// 変換リストによる連続置換 Ver1.03β 山紫水明
// 正規表現&複数ファイルテスト版
//////// オプション ///////////////////
$folder = "D:\\Temp";
//$folder = "D:\\DATA\\変換リスト";
//変換リストのあるフォルダーを指定する
//フォルダの区切りは"\\" と "\"マークを2つ重ねる必要があります。
#tick = tickcount;
// 田楽DLLのロード
loaddll(hidemarudir + "\\DengakuDLL.dll");
if (!result) {
message "田楽DLL をロードできませんでした。";
endmacro;
}
if ($folder == "") {
$folder = dllfuncstr("GETDIRNAME", hidemaruhandle(0),
"変換リストのあるフォルダを選択して下さい",
hidemarudir );
if ($folder == "") {
message "フォルダが選択されませんでした";
freedll;
endmacro;
}
}
$list = dllfuncstr("GETFILENAME", hidemaruhandle(0), "変換リストの選択",
$folder, "'変換リスト(*.*)'" );
if ( $list == "" ) {
message "キャンセルされました。";
freedll;
endmacro;
} else {
if ( strstr($list, "|") != -1 ) {
message "一つの変換リストしか選択できません。";
freedll;
endmacro;
}
}
menu "置換対象",
"&C 現在のファイル",
"&A フォルダ内全部";
if( result < 2 ) endmacro;
else if( result == 2 ) #object = 1;
else #object = 2;
#list = findhidemaru ($list);
if( #list >= 0 ) closehidemaru #list;
if( #object == 2 ) {
call GetFilename;
#fn = ##return;
} else #fn = 1;
freedll;
Menu:
menu "リストの変換方向",
"&1 左 → 右",
"&2 左 ← 右";
#direction = result;
if( #direction == 0 ) endmacro;
if( #direction == 1 ) goto Menu;
$cf = basename2;
#handle1 = hidemaruhandle( 0 );
#wordcnt = 0; //変換語取得計算
#repcnt = 0; //実際置換数計算
#totalcnt = 0; //変換数計算
#totalrep = 0; //総置換個数計算
#complete = 0;
call GetList;
call Replace;
if( #object == 2 ) {
enabledraw;
message "最初のファイルを置換しまた。異常ないか点検してください。"
+ "\n点検後に,中止は ESC キー,全ファイル置換はリターンキーを押す";
inputpos "●●● 中止は ESC キー,継続はリターンキーを押す ●●●";
if( iskeydown( 0x1b ) ) {
question "置換を取り消しますか?";
if( result == yes ) {
disabledraw;
while( #u <= #totalrep ) {
undo;
#u = #u + 1;
}
}
endmacro;
} else if( iskeydown( 0x0d ) ) {
save;
#i = 0;
while( #i < #fn ) {
if( $file[#i] != $cf ) {
loadfile $file[#i];
call Replace;
save;
}
#i = #i + 1;
}
}
loadfile $cf;
}
enabledraw;
title 0;
$time = str( tickcount - #tick );
message "置換ファイル数\t" + str(#fn) +
"\n置 換 回 数\t" + str(#linecnt) +
"\n有効置換回数\t" + str(#repcnt) +
"\n置 換 総 数\t" + str(#totalrep) +
"\n経 過 時 間\t" + leftstr($time, strlen($time) - 3) +
"." + rightstr($time , 3) + " 秒" ;
endmacro;
/////////// Main End ///////////////////////////////////////////
Replace:
title "**** 置換実行中です ****";
disabledraw;
if( #direction == 2 ) call ConvertLtoR;
else if( #direction == 3 ) call ConvertRtoL;
return;
//********************************************************************
GetList:
openfile "/h " + $list;
#w = width;
config "w1000";//折り返しを一時的にひろげる
#handle2 = hidemaruhandle( 0 );
gofiletop;
while( code == 0x0d || code == '/' ) down;
#linecnt = linecount2 - lineno;//置換リスト数(行数)
##i = 0;
while( code != eof ) {
if( code == 0x0d || gettext(0, y, 2, y) == "//") {
#linecnt = #linecnt - 1;
down;
continue;
}
$$line = gettext( 0, y, linelen, y );
##len = strlen( $$line );
##a = strstr( $$line, "," );
$a[##i] = leftstr( $$line, ##a );
$$line = midstr( $$line, ##a + 1, ##len );
##len = strlen( $$line );
##a = strstr( $$line, "," );
if( ##a < 0 ) {
$b[##i] = $$line;
$$c = "";
} else {
$b[##i] = leftstr( $$line, ##a );
$$c = midstr( $$line, ##a + 1, ##len );
}
$regular[##i] = $$c;
#y = lineno;
movetolineno 1, lineno + 1;
if( lineno == #y ) break;
##i = ##i + 1;
#wordcnt = #wordcnt + 1; //置換数
}
config "w" + str(#w);
setactivehidemaru #handle1;
closehidemaru #handle2;
return;
ConvertLtoR:
##i = 0;
while( ##i < #wordcnt ) {
if( $regular[##i] == "r" || $regular[##i] == "regular" )
replaceallfast $a[##i], $b[##i], regular;
else replaceallfast $a[##i], $b[##i];
#totalrep = #totalrep + result;
if( result ) #repcnt = #repcnt + 1;
##i = ##i + 1;
#totalcnt = #totalcnt + 1; //通算置換済数
}
return;
ConvertRtoL:
##i = 0;
while( ##i <= #wordcnt ) {
if( $regular[##i] == "r" || $regular[##i] == "regular" )
replaceallfast $b[##i], $a[##i],regular;
else replaceallfast $b[##i], $a[##i];
#totalrep = #totalrep + result;
if( result ) #repcnt = #repcnt + 1;
##i = ##i + 1;
#totalcnt = #totalcnt + 1; //通算置換済数
}
return;
GetFilename:
##n = dllfunc("SETCURDIR", directory);
##fn = 0;
##n = dllfunc("ENUMFILE", "*.*");
while (1) {
$file[##fn] = dllfuncstr("FINDNEXT");
if ($file[##fn] == "") break;
##fn = ##fn + 1;
}
return ##fn;
//------------------------------------------------------------------------//
|
|