複数文字列の置換No.03965
Norimasa さん 99/09/06 11:20
 
初めまして。

秀丸エディタを最近使い始めたのですが、当方のやりたい機能に
大量にある複数の異なる文字列を一気に置換させたい(下記に
示します)のですが、やりかたがわかりません。

例)

置換前  置換後
−−−−−−−−
大阪   Osaka
東京   Tokyo

置換前の文字列をCSVファイルか何かで作成しておいて、マクロ
機能(?)で実行することとかが考えられるのでしょうか?
対象となるのは1つのファイルだけです。

よろしくお願いします。

[ ]
RE:03965 複数文字列の置換No.03967
きいろいまふらあ さん 99/09/06 15:00
 
きいろいまふらあといいます。

昔作った簡易版が手元にあったのでアップします。

使い方。

置換したいファイルを秀丸で開き、ファイルの先頭に
置換したい語句のリストを手作業で作っておいて、
このリスト全体を範囲選択した状態で下のマクロを実行します。
(使い方。おわり)

リストの書式は
(置換前の語句)(タブ)(置換後の語句)(改行)
です。これを羅列します。例えば

(ファイルの先頭)
大阪Osaka
東京Tokyo

(置換の対象とするテキスト)
(ファイル末尾)

こんな感じにします。

リストの上から下に向かってファイル全体に置換をかけていきます。

注意1。

手抜きなのでリスト自体も置換されてしまいます。(^^;

注意2。

置換前や置換後の語句の包含関係に注意しないといけません。
AをBに置換してからBをCに置換すると、全部Cになってしまいます。
BをCに置換してからAをBに置換すれば、AがBに、BがCになります。
手作業で1組ずつ全置換をして、うまくいくような順番にして下さい。

注意3。

置換する文字列の中にタブコードは含められません。

注意4。

大阪→Osaka
新大阪→Shin-Osaka
のような置換は、もともと「新Osaka」というような文字列があった場合、
こいつも「Shin-Osaka」に変換してしまいます。
#大阪→Osakaの置換の時に、リスト中の「新大阪」を「新Osaka」に
#してしまうため。

ま、手抜きなので。
手でやるよりは多少ましということで。(^^;

完璧なやつは「欲しいよ〜」って書けば、誰か作ってくれる、かも。

//ここから
//alt_rep.mac

if(!selecting)endmacro;
escape;
moveto seltopx, seltopy;
#startrow = lineno;
moveto selendx, selendy;
#endrow = lineno -1;

#i = #startrow;
while(#i <= #endrow){
movetolineno 0, #i;
selectline;
$myterm = gettext(seltopx,seltopy,selendx,selendy);
#temp = strstr($myterm, "\t");
$myterm1 = leftstr($myterm,#temp);
$myterm2 = midstr($myterm,#temp+1,strlen($myterm)-#temp-3);

replaceall $myterm1, $myterm2;

#i = #i + 1;
}
endmacro;
//ここまで

[ ]
RE:03967 複数文字列の置換No.03968
きいろいまふらあ さん 99/09/06 15:01
 
>(ファイルの先頭)
>大阪Osaka
>東京Tokyo
>
>(置換の対象とするテキスト)
>(ファイル末尾)
>
>こんな感じにします。

タブコードが落ちてしまいました。
大阪とOsaka、東京とTokyoの間にタブコードが入っているつもりです。

[ ]
RE:03965 複数文字列の置換No.03970
番頭++ さん 99/09/06 15:34
 
>置換前の文字列をCSVファイルか何かで作成しておいて、マクロ
>機能(?)で実行することとかが考えられるのでしょうか?

汎用性はないマクロです。

//*1    a1.mac
    call pp_rep1 "東京", "Tokyo";
    call pp_rep1 "大阪", "Osaka";
//* 自分で追加
    gofiletop;
    endmacro;
pp_rep1:
    replaceallfast "^" + $$1, $$2, regular, word;   //  行頭の "^"
return;

または、
タブの CSV ファイルを作成して、a2.mac で別のマクロ a3.mac にします。
---------------
大阪Osaka
東京Tokyo
... tab ...
---------------

//*1    a2.mac
    replaceallfast "^.+\\f\\t\\f.+$",
    "replaceallfast \"^\" + \"\\0\" , \"\\2\" ,     regular;",
    regular, inselect;
    gofiletop;  saveas "a3.mac";
endmacro;

[ ]
RE:03970 複数文字列の置換No.03983
きいろいまふらあ さん 99/09/06 19:50
 
きいろいまふらあです…って名乗らなくても表示されてるのか。(^^;

>    replaceallfast "^" + $$1, $$2, regular, word;   //  行頭の "^"

行頭とは限らないのでは?
そんだけ。

[ ]
RE:03983 複数文字列の置換No.03984
番頭++ さん 99/09/06 20:00
 
>行頭とは限らないのでは?

そうかもしれません、またハズシタ ...

どこにも希望、仕様の詳細はありませんです、それが「投稿」じゃないですか、
困っている人は、「ワラにもすがりたい ... 」、だから色んな所に救いを求める、
昔、DOS/V のフォーラムが、素人と、プロに別れて、現在に至ってるのでしょう ...
時代は繰り返すのかも知れません。

[ ]
RE:03970 複数文字列の置換No.03986
Norimasa さん 99/09/07 09:06
 
番頭++ さん、きいろいまふらあ さんありがとうございます。

きいろいまふらあ さんの方はまだ試していないのですが、
番頭++ さんの方を試させていただきました。
1行に「東京」「大阪」がある場合、先のほうしか置換されない
ようです。

マクロについてはまったくわからないので、参考にさせていただいて
作ってみようと思います。

[ ]
RE:03986 複数文字列の置換No.03987
番頭++ さん 99/09/07 11:36
 
>1行に「東京」「大阪」がある場合、先のほうしか置換されない
>ようです。

replaceallfast "^" + "東京", "Tokyo", regular;//これは行の先頭だけです。
replaceallfast "東京", "Tokyo", word;//これは単語の置換です。

東京都とかの文字列で、「京都」==>「Kyoto」とかは出来ません。おかしくなります。

[ ]
RE:03987 複数文字列の置換No.03989
番頭++ さん 99/09/07 15:07
 
>東京都とかの文字列で、「京都」==>「Kyoto」とかは出来ません。おかしくなります。

//  出来たてであまりデバッグしていません。

//*5    KZ_MtRep1.mac - 1999/09/07 - K.Nakatake
//  連続置換マクロ - 単語 - あくまでも「秀丸」での単語の処理です。
//  置換の対象となるファイルを開いてこのマクロを実行する。
//  置換メタデータファイル ==> directory2 + "\\RepMeta1.txt" - カレントディ
レクトリ。
//      タブで区切った単語を指定する。
//      長い文字列をファイルの上部に置か無いとうまく行きません。自動化はシン
ドイ !
//      東京    とうきょう
//      大阪    おおさか

    if( code == '\t' ){ endmacroall;    }   //  debug
    $searchbuffer = searchbuffer;   #searchoption = searchoption;
    $str_f1 = filename2;
//T #handle1 = hidemaruhandle( findhidemaru( $str_f1 ) );
//T setactivehidemaru #handle1;
    if( ! selecting ){
        gofiletop;  #x_start = x;   #y_start = y;
    } else {
        #x_start = seltopx; #y_start = seltopy;
    }
    while( true ){
        if( $str_meta1 == "" ){
            $str_meta1 = directory2 + "\\RepMeta1.txt";
        }
        $str_meta1 = input("置換メタデータファイルを指定してください",$str_m
eta1);
        if( ( ! result ) || $str_meta1 == "" ){ endmacro;   }
    //T message $str_meta1;
        if( existfile($str_meta1) ){    //  ファイルの存在チェック
            break;
        }
    }
    $str_f2 = $str_meta1;
    if( findhidemaru($str_meta1) == -1 ){
        openfile "/h " + $str_meta1;    #sw_meta1 = 1;
    } else {
        #handle2 = hidemaruhandle( findhidemaru( $str_f2 ) );
        setactivehidemaru #handle2;
    }
    gofiletop;
    while( code != eof ){
        call pp_rword1;
        #handle1 = hidemaruhandle( findhidemaru( $str_f1 ) );
        setactivehidemaru #handle1;
    //T disableinvert;  disabledraw;
        replaceallfast $wk1, $wk2, word, inselect;  //  単語、範囲選択
        #handle2 = hidemaruhandle( findhidemaru( $str_f2 ) );
        setactivehidemaru #handle2;
    }
    #handle1 = hidemaruhandle( findhidemaru( $str_f1 ) );
    setactivehidemaru #handle1;
    if( #sw_meta1 ){
        closehidemaruforced hidemaruhandle(findhidemaru($str_f2));
    }
    moveto 0, #y_start;
    enableinvert;   enabledraw; title 0;
    setsearch $searchbuffer, #searchoption;
endmacro;

pp_rword1:
    selectword; $wk1 = gettext(seltopx,seltopy,selendx,selendy);    escape;
    selectword; right;  //  単語
    if( code != '\t' ){
        message "置換メタデータファイルにタブがありません !";
        endmacro;
    }
    right;
    if( code == 0x0D ){
        message "置換メタデータファイルが不良です !";
        endmacro;
    }
    selectword; $wk2 = gettext(seltopx,seltopy,selendx,selendy);    escape;
    selectword; right;  //  単語
    if( code != 0x0D ){
        message "置換メタデータファイルに改行がありません !";
        endmacro;
    }
    if( $wk1 == $wk2 || $wk1 == "" || $wk2 == "" ){
        message "置換メタデータは同一、またはおかしいです !";
        endmacro;
    }
    right;
return;


[ ]
RE:03989 複数文字列の置換No.03997
Norimasa さん 99/09/08 10:13
 
書いていただいたマクロでやりたいことが実現しました。
本当にありがとうございます。

[ ]
RE:03997 複数文字列の置換No.03998
ブラボー さん 99/09/08 10:52
 
>書いていただいたマクロでやりたいことが実現しました。
>本当にありがとうございます。

マクロ初心者ですが、教えていただきたいのですが
「マクロ」の記述は言語でいうと何という言語になるのですか?

[ ]
RE:03998 複数文字列の置換No.03999
番頭++ さん 99/09/08 11:29
 
>「マクロ」の記述は言語でいうと何という言語になるのですか?

http://www.ceres.dti.ne.jp/~sugiura/index.html に、

「お笑い(^^; マクロど〜じょ〜」があります。

http://win.blue.co.jp/~jr-kun/

「秀丸Q&A集 第4版」があります。

「秀シリーズサポートフォーラム」には、
「秀丸エディタ マクロ作者会議室」があります。
そこに投稿するのがお勧めです。

[ ]
RE:03998 複数文字列の置換No.04000
きいろいまふらあ さん 99/09/08 12:47
 
>「マクロ」の記述は言語でいうと何という言語になるのですか?

秀丸のマクロは、秀丸のマクロ専用の言語で書きます。
一般的なプログラミング言語ではありません。

でも、一応C言語ライク、らしいです。
私、Cはあんまり知らないので、どれくらい「ライク」がわかりませんが。

[ ]
RE:03989 複数文字列の置換No.04128
梅吉君 さん 99/10/04 15:24
 

置換メタデータファイルにタブがありません !";

このように表示される場合はどのように修正したらよいでしょうか?


[ ]
RE:04128 複数文字列の置換No.04129
番頭++ さん 99/10/04 16:02
 
>置換メタデータファイルにタブがありません !";

「置換メタデータファイル」は、タブで区切った単語を指定してください。

検索文字列[Tab]置換文字列
========================================================================
東京[Tab]とうきょう
大阪[Tab]おおさか
...
========================================================================

とこんな感じです。[Tab] の表記はキーボードのタブキーです。
このロジックは、秀丸で言うところの「単語」置換なので、
梅吉君 さんの希望する処理にあてはまるのか、わかりません。

[ ]
RE:04129 複数文字列の置換No.04132
梅吉君 さん 99/10/04 18:41
 

>梅吉君 さんの希望する処理にあてはまるのか、わかりません。

まだ、出来ていない状態です、、、、、

こんな置換も可能でしょうか?

----------------------------------------------------------------
//  1999年12月->1999/12/
//  日&&->&&
//  <br>->
----------------------------------------------------------------






[ ]
RE:04132 複数文字列の置換No.04134
番頭++ さん 99/10/05 12:01
 
>こんな置換も可能でしょうか?

KZ_MtRep1.mac は、秀丸で言うところの「単語」を対象とした置換なので、それ
は出来ません。

マクロでも置換オプションの組み合わせが異なると、メタデータで指定すること
になり、あまり汎用的なロジックにはなりません。置換の結果が安定しないマク
ロはメリットも無いでしょう。


//*1    aa1.mac
    replaceallfast "1999年12月" , "1999/12/" , inselect;
    replaceallfast "日&&" , "&&" , inselect;
    replaceallfast "<br>" , "" , inselect;
endmacro;

こんな感じで手作業で書いたほうが早いです。replace 関連のオプションは、マ
クロのヘルプで確認してください。質問は「秀丸エディタ マクロ作者会議室」
にすると良いでしょう。

========================================================================
1999年12月[Tab]1999/12/
日&&[Tab]&&
<br>[Tab]
...
========================================================================

上のようなデータを次のマクロで整形は可能です。

//*1    aa2.mac
    replaceallfast "^.+\\f\\t\\f.*$",
    "replaceallfast \"\\0\" , \"\\2\" , inselect;",
    regular, inselect;
    gofiletop; // saveas "aa3.mac";
endmacro

「 RE:03970 99/09/06 15:34  RE:03965 複数文字列の置換」も参照してください。

次の場所でマクロを探せます。
http://hidemaru.xaxon.co.jp/library/macro.html
http://www.vector.co.jp/

http://www.ceres.dti.ne.jp/~sugiura/index.html に、
「お笑い(^^; マクロど〜じょ〜」が在るみたいです。

http://win.blue.co.jp/~jr-kun/ に、
「秀丸Q&A集 第 x 版」が在るみたいです。

この件に関してはこれでおしまいです。


[ ]
RE:04134 複数文字列の置換No.04135
梅吉君 さん 99/10/05 12:25
 
>//*1    aa1.mac
>    replaceallfast "1999年12月" , "1999/12/" , inselect;
>    replaceallfast "日&&" , "&&" , inselect;
>    replaceallfast "<br>" , "" , inselect;
>endmacro;
>
>こんな感じで手作業で書いたほうが早いです。replace 関連のオプションは、マ
>クロのヘルプで確認してください。質問は「秀丸エディタ マクロ作者会議室」
>にすると良いでしょう。
>
>========================================================================
>1999年12月[Tab]1999/12/
>日&&[Tab]&&
><br>[Tab]
>...
>========================================================================
>
>上のようなデータを次のマクロで整形は可能です。
>
>//*1    aa2.mac
>    replaceallfast "^.+\\f\\t\\f.*$",
>    "replaceallfast \"\\0\" , \"\\2\" , inselect;",
>    regular, inselect;
>    gofiletop; // saveas "aa3.mac";
>endmacro
>
>「 RE:03970 99/09/06 15:34  RE:03965 複数文字列の置換」も参照してください。
>
>次の場所でマクロを探せます。
>http://hidemaru.xaxon.co.jp/library/macro.html
>http://www.vector.co.jp/
>
>http://www.ceres.dti.ne.jp/~sugiura/index.html に、
>「お笑い(^^; マクロど〜じょ〜」が在るみたいです。
>
>http://win.blue.co.jp/~jr-kun/ に、
>「秀丸Q&A集 第 x 版」が在るみたいです。
>
>この件に関してはこれでおしまいです。
>

ありがとうございます
無事一括変換出来ました



[ ]