漢数字からの変換教えてくださいNo.02200
num@ さん 01/05/24 07:08
 
num@です
またまたお尋ねします。

漢数字を半角の数字に変換したいのですが
簡単にできるマクロを教えてください。
できれば一気に以下のようになればよりgoodなのです。

山本さんの管理数は二千百七十二人。

山本さんの管理数(タブ区切り)2172

[ ]
RE:02200 漢数字からの変換教えてくださいNo.02201
番頭++ さん 01/05/24 08:05
 
>漢数字を半角の数字に変換したいのですが

これはある程度ロジックを組まないとできません。みたい。
漢数字 (?) の前後にタブを入れて Excel に処理させると、
出来ませんでしたっけ !!!

# 零零七、零百零十七 ==> 007 ...
# ある程度、の手作業を期待すると簡単かもしれません。

[ ]
RE:02201 漢数字からの変換教えてくださいNo.02203
番頭++ さん 01/05/24 09:37
 
># 零零七、零百零十七 ==> 007 ...
># ある程度、の手作業を期待すると簡単かもしれません。

//  これ以上は考えたくないです ... 仕事仕事仕事 !!!
//  「とんで」も、「とんで」がない仮のマクロです。

//*5    A007.mac
    $s1z1 = "十百千万";
    $s1z2 = "零一二三四五六七八九";
    $s1z = $s1z1 + $s1z2 ;
    $s1h = "0000" + "0123456789";
    searchdown "[" + $s1z + "]+", regular, inselect;
    if( result ){
        #xs = seltopx;  #ys = seltopy;  #xe = selendx;  #ye = selendy;
        $wk1 = gettext(seltopx,seltopy,selendx,selendy);    escape;
        if( strlen($wk1) <= 2 ){    endmacro;   }   //  2 bytes !!!
        call pp_foifoi1;
        $wk3 = input("この文字を、変換しますか ??? \n"+$wk1,$wk2);
        if( ! result ){ endmacro;   }
        moveto #xs, #ys;    beginsel;   moveto #xe, #ye;
        delete; insert "\t" + $wk2;
    }
endmacro;

pp_foifoi1:
    $wk2 = "";  #v = 0;
    #i = 0;
    while( true ){
        $w = midstr($wk1,#i,2);
        #j = strstr($s1z,$w);
        if( #j == -1 ){ break;  }
        if( strstr($s1z2,$w) != -1 ){
            $w_v = midstr($s1h,#j/2,1); #v = 1;
        } else {
            if( #v != 0 ){
                $w_v = "";
            } else {
                $w_v = "1"; //  ここに位のロジックを入れるんだ ...
            }
            #v = 0;
        }
        $wk2 = $wk2 + $w_v;
        #i = #i + 2;
    }
return;

[ ]
RE:02203 漢数字からの変換教えてくださいNo.02204
番頭++ さん 01/05/24 09:56
 
もう修正です。

    $s1z1 = "拾十百千万";
    $s1z2 = "零壱一弐二参三四五六七八九";
    $s1z = $s1z1 + $s1z2 ;
    $s1h = "00000" + "0112233456789";

        delete; insert "\t" + $wk3;
>        delete; insert "\t" + $wk2; // バグでした。


[ ]
RE:02204 漢数字からの変換教えてくださいNo.02205
番頭++ さん 01/05/24 13:42
 
http://hpcgi2.nifty.com/bantou_pp/c_wforum.cgi?mode=allread&no=100297&page=0

ここに案を書いておきました。


[ ]
RE:02200 漢数字からの変換教えてくださいNo.02207
ひろ さん 01/05/24 18:32
 
 今日は、ひろです。
> 漢数字を半角の数字に変換したいのですが
 番頭++ さんと違って怠け者なので、「漢数字 <-> 算数字相互変換マクロ」
http://win.blue.co.jp/~jr-kun/hm_macro.html#N_CNV
を紹介します(^^;。

> 山本さんの管理数は二千百七十二人。
> ▼
> 山本さんの管理数(タブ区切り)2172
をしたいなら、予め
検索文字列:[壱弐参一二三四五六七八九十百千万億兆京垓]+\f人
置換文字列:\t\0
で正規表現を ON で処理すればよいでしょう。
 ##上記以上の桁は、恐らく文字コードがないと思う

[ ]
RE:02205 漢数字からの変換教えてくださいNo.02210
num@ さん 01/05/24 23:59
 
番頭++さん
いつも迅速なレスありがとうございます。
能力の問題ですぐに反応できないのでゆっくりと考えさせてください。
とりあえずの感謝を申し上げます。
num@

[ ]
RE:02207 漢数字からの変換教えてくださいNo.02211
num@ さん 01/05/24 23:59
 
ひろさん
>「漢数字 <-> 算数字相互変換マクロ」
ありがとうございます。
ゆっくり勉強させてください。
とりあえずの感謝もうしあげます。
num@

[ ]
RE:02200 漢数字からの変換教えてくださいNo.02217
安久津 さん 01/05/25 18:01
 
こんにちは num@さん、安久津といいます。

num@> 漢数字を半角の数字に変換したいのですが
num@> 簡単にできるマクロを教えてください。

番頭++>http://hpcgi2.nifty.com/bantou_pp/c_wforum.cgi?mode=allread&no=100297
&page=0
番頭++>ここに案を書いておきました。
本当にもどきだ。(^^;)

ひろ>http://win.blue.co.jp/~jr-kun/hm_macro.html#N_CNV
ひろ>を紹介します(^^;。
ちゃんと動かなかったです。(^^;)

つづく。

[ ]
RE:02217 漢数字からの変換教えてくださいNo.02218
安久津 さん 01/05/25 18:23
 
● kan2arabic.mac
// ---------------------------------------------------------------
kan2arabic:
// 選択範囲の漢数字を算用数字に変換する。
// '万'以上の桁を代入。1文字のみ有効。大きな桁は左側。京 > 兆 > 億 > 万
// '萬'は内部処理で'万'にしている。
$KETA = "垓京兆億万";
// ---------------------------------------------------------------
    if( ! selecting ) endmacro;
    if( $KETA=="" ) $KETA="垓京兆億万";
    if( #KETASIZE==0 ) #KETASIZE = strlen($KETA)/2;
    ##tx = seltopx; ##ty = seltopy;
    ##ex = selendx; ##ey = selendy;
    escape;
    moveto ##ex, ##ey; insert " ";
    moveto ##tx, ##ty;
    // ------------------------------
    // 一桁の零を認める場合。例 負債総額 零円
    // if( code == '零' ){ delete; insert "0"; return 1; }
    // ------------------------------
    ##num = 0; ##sum = 0;
    ##i = 0;
    while( ##i < #KETASIZE ){
        ##keta[##i] = 0;
        ##i = ##i + 1;
    }
    while( code != ' ' )
    {
        if( code == '壱' ){
            delete; insertfix "一";
        }else if( code == '弐' ){
            delete; insertfix "二";
        }else if( code == '参' ){
            delete; insertfix "三";
        }else if( code == '萬' ){
            delete; insertfix "万";
        }else if( code == '拾' ){
            delete; insertfix "十";
        }
        $$ch = char(code);
        ##k = strstr( "一二三四五六七八九", $$ch );
        if( ##k != -1 ){
            if( ##num ){
                moveto ##ex, ##ey; delete;
                moveto ##tx, ##ty;
                endmacro;
                // return 0; // 無効。
            }
            ##num = (##k / 2) + 1;
        }else{
        // ここのエラー処理は面倒だ。
            ##k = strstr( "十百千", $$ch );
            if( ##k != -1 ){
                ##k = (##k / 2) + 2; // みそ。
                ##k = val( leftstr("1000",##k) );
                if( ##num == 0 ) ##num = 1;
                ##sum = ##sum + (##num * ##k);
                ##num = 0;
            }else{
                ##k = strstr($KETA,$$ch);
                if( ##k == -1 ){
                    moveto ##ex, ##ey; delete;
                    moveto ##tx, ##ty;
                    endmacro;
                    // return 0; // 無効。
                }
                ##k = (##k / 2);
                ##keta[##k] = ##sum + ##num;
                ##sum = 0; ##num = 0;
            }
        }
        right;
    }// end of while( code != ' ' )
    // ------------------------------
    ##num = ##sum + ##num;
    // ------------------------------
    moveto ##tx, ##ty; beginsel;
    moveto ##ex, ##ey; right; // space
    delete;
    // ------------------------------
    // $KETA = "垓京兆億万";
    ##i = 0;
    while( ##i < #KETASIZE ){
        if( ##keta[##i] ) break;
        ##i = ##i + 1;
    }
    if( ##i < #KETASIZE ){
        insert str(##keta[##i]);
        ##i = ##i + 1;
        while( ##i < #KETASIZE ){
            ##tmp = ##keta[##i];
            insert rightstr("0000"+str(##tmp),4);
            ##i = ##i + 1;
        }
        insert rightstr("0000"+str(##num),4);
    }else{
        insert str(##num);
    }
    moveto ##tx, ##ty;
endmacro;
// return 1;
// kansuuji2arabicnumerals
// ---------------------------------------------------------------

● kan2arabic.mac の使い方。
(1) kan2arabic.mac を秀丸マクロフォルダにコピーする。
(2) 変換したい漢数字を選択して、kan2arabic.mac を実行する。

これは、目で確認して使うタイプ。
つづく。

[ ]
RE:02218 漢数字からの変換教えてくださいNo.02219
安久津 さん 01/05/25 18:35
 
● test.mac
// kan2arabic.mac の動作テスト
// ---------------------------------------------------------------
// テスト用データ生成。
newfile;
insert "\n";
insert "一千円\n";
insert "千円\n";
insert "一百円\n";
insert "百円\n";
insert "一十円\n";
insert "十円\n";
insert "千百十円\n";
insert "千百十一億千百十一万千百十一円\n";
insert "一千一百一十一億一千一百一十一萬一千一百一十一円\n";
insert "二十一億四千七百四十八万三千六百四十七円\n";
insert "三千六百四十七京四千七百四十八万三千六百四十七円\n";
insert "壱億弐萬千百十壱円\n";
insert "壱億弐萬千百十壱マルク\n";
insert "九千八百七十六垓一億二十円\n";
insert "ここは無効:九千八百七十六垓一億二五円 で停止する。\n";
insert "二十五であって、二五は間違い。\n";
insert "二十三十円や十億一万十兆円に対するエラー処理はしていません。\n";
##ln = lineno;
insert "----------------------\n";
selectall; copy;
paste;
movetolineno 1, ##ln;
// ---------------------------------------------------------------
// 次のようにならないような検索を考えるのは、ユーザーの仕事。
//「参事官がサイフを拾った。」->「3事官がサイフを10った。」
//「九十九里浜」->「99里浜」
// (1)漢数字に含まれる文字。
$KANSUUJI = "[一壱二弐三参四五六七八九垓京兆億万萬千百十拾]+";
// $KANSUUJI = "[一二三四五六七八九垓京兆億万千百十]+";
// (2)変換してもよい場合。
// searchdown $KANSUUJI+"(円|人|本|冊)", regular;
// $SUFFIX = "[人円ドマ元冊本羽匹]"; <- こっちは、ちょっとあいまい。
$SUFFIX = "(人|円|ドル|マルク)";
// こっちは、jre32.dll だと8個の選択肢まで。
// ---------------------------------------------------------------
    $$sbuf = $KANSUUJI + $SUFFIX;
    searchdown $$sbuf, regular;
    while( result ){
        escape; beginsel;
        searchdown $SUFFIX, regular;
        // 選択範囲の漢数字を算用数字に変換。
        execmacro "kan2arabic.mac";
        if( code < '0' || code > '9' ){
            message "無効な漢数字。"; break;
        }
        // finddown; // OK
        searchdown $$sbuf, regular;
    }
    beep;
endmacro;
// ---------------------------------------------------------------

● test.mac の使い方。
(1) test.mac を秀丸マクロフォルダにコピー。
(2)どんなファイル上でもいいから、test.mac を実行する。

こっちは、マクロで確認して、kan2arabic.mac を利用するタイプ。

おしまい。
#バグっていたらスンマソン。

[ ]
RE:02219 漢数字からの変換教えてくださいNo.02220
番頭++ さん 01/05/25 19:32
 
>おしまい。

さすがの、安久津 さんですね。

記号としての文字列、数字としての文字列があるみたい、ですよね。
あとは、ヨミカタかも ...

... 0000兆0000億0000万0000
... ABCD兆ABCD億ABCD万ABCD

ABCD: 千百十一 のロジックの整合性、フラグでもチェック可能かも。
10 ** 4 進数。と千百十一、、二次元の位と数値の文字の組み合わせ。

昔の番地だと壱は必要みたい。三丁目壱番地。壱弐参町。
法令壱〇弐号、、あるんかな ...

廿 0x93F9 じゅう、〇 0x815A ぜろ もあるみたいだし。

平成元年、元祖英国 〇〇七、零零七、零百零十七 ==> 007 !!!
渋谷 十九 とーきゅう ==> 109 ???

あんましハマラないように、モドキのお勧めです。

# 寝れば終わる物語 ...
# ネバー・エンディング・すとーりーーー

[ ]
RE:02219 漢数字からの変換教えてくださいNo.02238
num@ さん 01/05/27 22:19
 
アクツさん
返事が遅くなりました。
num@です。


●kan2arabic.mac は手作業で大変だなという感じでしたが
●test.mac を動かして見るにつけ オオオーーという感じでした。

テスト用データを見るに流石という感じです。
実際には処理するデータを表示してから

>movetolineno 1, ##ln;
から
>endmacro;
までで
使用しております。

>#バグっていたらスンマソン。
バグも無いようです。
ありがとうございました。

[ ]
RE:02207 漢数字からの変換教えてくださいNo.02239
num@ さん 01/05/27 22:19
 
ひろさん
返事が遅くなりました。
num@hiroです。

> 番頭++ さんと違って怠け者なので、「漢数字 <-> 算数字相互変換マクロ」
>http://win.blue.co.jp/~jr-kun/hm_macro.html#N_CNV
>を紹介します(^^;。

@ 算数字 <-> 漢数字相互変換マクロ  num_conv.mac Ver.1.01          //
A 算数字 -> 漢数字変換マクロ  san2kan.mac Ver.0.01                //
B 漢数字 -> 算数字変換マクロ  kan2san.mac Ver.0.03                //

それぞれ動作確認できましたが、@をさらに使い込んで見たいと思います。

>> 山本さんの管理数は二千百七十二人。
>> ▼
>> 山本さんの管理数(タブ区切り)2172
>をしたいなら、予め
>検索文字列:[壱弐参一二三四五六七八九十百千万億兆京垓]+\f人
>置換文字列:\t\0
>で正規表現を ON で処理すればよいでしょう。

この点まで教えていただき助かりました。
この変換もマクロに組み込めるか研究課題としたいと思います。

(感)m(__)m(謝)

[ ]
RE:02205 漢数字からの変換教えてくださいNo.02240
num@ さん 01/05/27 22:19
 
番頭++さん
num@です。

>http://hpcgi2.nifty.com/bantou_pp/c_wforum.cgi?mode=allread&no=100297&page=0
>
>ここに案を書いておきました。
拝見しました。
//*5 A007_B.mac - Ver. 01.05B - K.Nakatake
//*5 A007_A.mac - Ver. 01.05B - K.Nakatake
いずれも試して見ましたが変換がなされませんでした。
マクロを読む力がないもので申し訳ありません。

結果として
ひろさん
アクツさん
にレスしたように
変換は希望とおり解決しておりますことを
お伝えしたいと思います。

今後とも宜しくお願いします。

[ ]
RE:02239 漢数字からの変換教えてくださいNo.02245
ひろ さん 01/05/28 15:05
 
 num@ さん今日は、ひろです。
> この変換もマクロに組み込めるか研究課題としたいと思います。
 簡単にできますよ。以下のマクロで一本化できます。
//-----------------------------------------------------------------
replaceallfast "[壱弐参一二三四五六七八九十百千万億兆京垓]+\\f人",
  "\\t\\0",regular;
execmacro "kan2san.mac";

[ ]