変数の文字から数字をNo.02710
ただの通りすがり さん 01/11/30 01:53
 
人生の初心者です。
変数でつまずいてます。
今、
$date="01/11/30";
と入ってるとします。
これを、
$date="011130"とスラッシュを消したいのですが、
どのような手がありますでしょうか?

また、電話番号などにも応用して、
"03-4567-8910"を"0345678910"というふうに変換したいです。
要するに、数字のみを抜き出したいのです。

新規に秀丸に貼り付けて、置換して、コピーして、閉じる。
なんてダサいことをしたくないんで。
宜しくお願いします。

[ ]
RE:02710 変数の文字から数字をNo.02711
ENCODINGSHIFTJIS さん 01/11/30 09:12
 
マクロのstrstrは保留中です、現在は正規表現(通称Regex)操作の可能
なのは、編集面なので、事前にマクロ作業用の編集面を開いておき
そこに文字列を落として処理し、結果を再び文字列に回収します。
高頻度のSDI画面切替えが発生するため、低性能PCではまれに
不調になるかもしれません。

『マクロライブラリ』田楽サーバーの GSUB を利用する例を示します。

// sampleGSUB.mac
//田楽DLLのロード
loaddll(hidemarudir + "\\DengakuDLL.dll");
if (!result) {
message "DLL をロードできませんでした。";
endmacro;
}
//
$date="01/11/30";
$date=dllfuncstr("GSUB",$date,"/","",-1);// 正規表現置換
menu $date;
// 切断・開放
freedll;

[ ]
RE:02710 変数の文字から数字をNo.02713
TAKA さん 01/11/30 10:40
 
TAKA です。

>新規に秀丸に貼り付けて、置換して、コピーして、閉じる。
>なんてダサいことをしたくないんで。

特定の文字列を特定の文字列に置換するサブルーチンを作ればよい
です。

// テストマクロ(ここから)
    $Str = "01/11/30";
    call Replace $Str, "/", ""; // 「/」をヌルに置換
    $Str = $$return;
    message $Str;

    $Str = "03-4567-8910";
    call Replace $Str, "-", ""; // 「-」をヌルに置換
    $Str = $$return;
    message $Str;
    endmacro;

// 文字列置換
// $$1:置換対象文字列 $$2:置換前文字列 $$3:置換後文字列
// $$return 置換後文字列
Replace:
    ##Len = strlen( $$1 );
    ##BLen = strlen( $$2 );
    ##ALen = strlen( $$3 );
    $$Str = "";
    $$StrWk = $$1;
    // 置換対象文字列から置換前文字列を検索し置換後文字列に変更
    while( 1 )
    {
        ##Pos = strstr( $$StrWk, $$2 );
        if( ##Pos == -1 )
        { // 置換前文字列がない
            break;
        }
        $$Str = $$Str + leftstr( $$StrWk, ##Pos ) + $$3;
        $$StrWk = rightstr( $$StrWk, strlen( $$StrWk ) - ( ##Pos + ##BLen ) );
    }
    $$Str = $$Str + $$StrWk;    // 残りの文字列を連結
    return $$Str;
// テストマクロ(ここまで)

[ ]
RE:02713 変数の文字から数字をNo.02714
TAKA さん 01/11/30 11:06
 
TAKA です。

>特定の文字列を特定の文字列に置換するサブルーチンを作ればよい
>です。

タイトルを読んでいませんでした。数値の部分を取り出すマクロが
必要だったようです。以下のマクロで可能です。
汎用的に、特定の文字の部分を抜き出すサブモジュールにしていま
す。

// テストマクロ(ここから)
    $Num = "01234567890123456789";

//  $Str = "01/11/30";
    $Str = "01/11/30";
    call StrGet $Str, $Num;
    $Str = $$return;
    message $Str;

//  $Str = "03−4567−8910";
    $Str = "03-4567-8910";
    call StrGet $Str, $Num;
    $Str = $$return;
    message $Str;
    endmacro;

// 特定の文字のみ取得
// $$1:変換前文字列
// $$2:特定の文字(文字列で指定)
// $$return 変換後文字列
StrGet:
    ##StrLen = strlen( $$1 );
    $$Str = "";
    ##I = 0;
    while( ##I < ##StrLen )
    {
        ##Wk = ascii( midstr( $$1, ##I, 2 ) );
        if( ( ##Wk & 0xff00 ) != 0 )    ##Cnt = 2;  // 2バイト文字
        else                            ##Cnt = 1;
        $$Wk = char( ##Wk );
        if( strstr( $$2, $$Wk ) != -1 )
        { // 特定の文字
            $$Str = $$Str + $$Wk;
        }
        ##I = ##I + ##Cnt;
    }
    return $$Str;
// テストマクロ(ここまで)

[ ]
RE:02711 変数の文字から数字をNo.02715
ENCODINGSHIFTJIS さん 01/11/30 12:31
 
訂正とおわび、 GSUB は正規表現ではないです。
やはり普通のスクリプトの様な本格的 Regex が無いと
行数増えてしまいます。プラス200kBとしても強化マクロ版
が欲しいです。あるいはスクリプト言語との直結(いつか)

[ ]
RE:02710 変数の文字から数字をNo.02720
ただの通りすがり さん 01/11/30 23:41
 
ENCODINGSHIFTJISさん。
田楽を用いたことがないため、イマイチ理解しておりません。
でも、なんだかシンプルに出来そうで・・・。後でゆっくり学んでみます。
TAKAさん。
想定していなかった全角数字まで対応していただき、そのうえ
汎用化までも考えていただき、たいへん感謝いたしております。
思っていたよりもコードが複雑なんでビックリしましたが、
何とか追っかけることが出来ました。
どうも、ありがとうございました。

[ ]