(現在 過去ログ93 を表示中)

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

[ 最新記事及び返信フォームをトピックトップへ ]

■13790 / inTopicNo.1)  文字列から記号のみ取り出ししたい
  
□投稿者/ いぶけん -(2023/05/28(Sun) 07:00:20)
    2023/05/28(Sun) 07:18:29 編集(投稿者)
    2023/05/28(Sun) 07:05:35 編集(投稿者)

    "/123abc*#" のような文字列があったとします
    記号位置と記号文字数はランダムです


    ここから項目計算式で、英数字を除いた"/*#"のみを取り出したいのですが
    スマートな方法が分からずアドバイスを頂きたいです。

    桐10sです


    追記:
    英数字も記号同様ランダムです。
引用返信 [メール受信/OFF] 削除キー/
■13791 / inTopicNo.2)  Re[1]: 文字列から記号のみ取り出ししたい
□投稿者/ まさやん -(2023/05/28(Sun) 13:16:05)
    2023/05/28(Sun) 18:02:59 編集(投稿者)

    2023/05/28(Sun) 17:46:34 編集(投稿者)
    2023/05/28(Sun) 17:33:31 編集(投稿者)

    > "/123abc*#" のような文字列があったとします
    > 記号位置と記号文字数はランダムです
    >
    >
    > ここから項目計算式で、英数字を除いた"/*#"のみを取り出したいのですが


    表 会話式での式は 解りませんが、


    &比較式="/123abc*#",&STR=""
    繰り返し
       &置換式=#部分列(&比較式,#IS記号(&比較式,0),1)
       条件 (#IS記号(&置換式,1)=0) 繰り返し中止
       &比較式=#文字置換(&比較式,&置換式,"")
    &STR=&STR+&置換式
                
    繰り返し終了

    変数書き出し "記号",{&STR},終了状態=&秒

    で なると思います。

    #IS記号 という 関数 と  #部分列 関数 でできると思います。



    同じ内容ですが if文でやってみました。

    &比較式="/123abc*#/%%",&STR=""
    繰り返し
      条件 (#IS記号(&比較式,0)=0) 繰り返し中止
    if(#IS記号(&比較式,0)>0)
        &置換式=#部分列(&比較式,#IS記号(&比較式,0),1)
        &比較式=#文字置換(&比較式,&置換式,"")
    &STR=&STR+&置換式
    end
    繰り返し終了
                変数書き出し "記号",{&STR},終了状態=&秒



    半角のみ抽出の場合

    &比較式="/123abc*#/%%",&STR=""
    繰り返し
      条件 (#IS記号(&比較式,0)=0) 繰り返し中止
    if(#IS記号(&比較式,0)>0)
         &置換式=#部分列(&比較式,#IS記号(&比較式,0),1)
          if(#IS全角(&置換式,0)=0)
    &STR=&STR+&置換式
    end
          &比較式=#文字置換(&比較式,&置換式,"")
    end
    繰り返し終了
                変数書き出し "記号",{&STR},終了状態=&秒


    全角のみ抽出の場合

    &比較式="/123abc*#/%%",&STR=""
    繰り返し
      条件 (#IS記号(&比較式,0)=0) 繰り返し中止
    if(#IS記号(&比較式,0)>0)
         &置換式=#部分列(&比較式,#IS記号(&比較式,0),1)
          if(#IS半角(&置換式,0)=0)
    &STR=&STR+&置換式
    end
        &比較式=#文字置換(&比較式,&置換式,"")
    end
    繰り返し終了
                変数書き出し "記号",{&STR},終了状態=&秒

    変数書き出し は 一つの例です

      行訂正 []=&STR  
引用返信 [メール受信/OFF] 削除キー/
■13792 / inTopicNo.3)  Re[1]: 文字列から記号のみ取り出ししたい
□投稿者/ ONnoji -(2023/05/28(Sun) 14:18:39)
    > "/123abc*#" のような文字列があったとします
    > 記号位置と記号文字数はランダムです
    > ここから項目計算式で、英数字を除いた"/*#"のみを取り出したいのですが

    このリクエストは[記号文字だけを残す]という意味なのですか?


引用返信 [メール受信/OFF] 削除キー/
■13793 / inTopicNo.4)  Re[2]: 文字列から記号のみ取り出ししたい
□投稿者/ いぶけん -(2023/05/28(Sun) 14:25:46)

    > このリクエストは[記号文字だけを残す]という意味なのですか?

    そうです。書き漏らしましたが、
    記号も /*# だけではなく、?$など全ての記号を #部分列 みたいな感じで取り出せないか?ということです。

    先にも書きましたが、その項目の英数字を含む文字数もランダムであり、
    記号の文字数もランダム、記号の文字位置もランダムです。
引用返信 [メール受信/OFF] 削除キー/
■13796 / inTopicNo.5)  Re[3]: 文字列から記号のみ取り出ししたい
□投稿者/ ONnoji -(2023/05/28(Sun) 17:55:41)
    2023/05/29(Mon) 12:00:01 編集(投稿者)
    2023/05/29(Mon) 10:23:12 編集(投稿者)
    2023/05/29(Mon) 00:31:20 編集(投稿者)

    > 記号も /*# だけではなく、?$など全ての記号を #部分列 みたいな感じで取り出せないか?ということです。

    記号文字が含まれているか否かは #is記号という関数で調べられます。

    なお、この関数は最初に見つかった記号文字が何番目に位置しているという情報を返します。

    しかし、複数個の記号文字が含まれている可能性がありますから、計算式一発!というわけにはいかないですね。

    この場合には、文字列の先頭から末尾まで一文字ずつシフトして調べていく方法がシンプルです。※シンプル・イズ・ベスト

    対象になる文字列の文字数がどんなに多くても、あっという間に実行完了してしまいますので、パフォーマンスを心配する必要はありませんよ。

    ということで、こういうのは関数では出来ないですよ。

    [フォーム+イベント処理]のサンプルを添付しますので参考にしてください。

    なお、添付ファイルは数日を目途に削除しますので、ダウンロードはお早めに願います。

    <参考>

    ■フォームの編集対象表の表定義

    項目番号  項目名      データ型 項目計算式 挿入初期値式
    1     文字列      文字列  
    2     記号文字抽出結果 文字列  

    ■フォームのコマンドボタン

     オブジェクト名: cmd記号文字を抽出
     標題     : 記号文字を抽出

      機能名    機能パラメータリスト
     1 表示
     2 手続き実行  cmd記号文字を抽出Click
     3 なし
     4 なし

    ■イベントン処理の定義

    名札  メイン



    手続き定義開始 cmd記号文字を抽出Click( )
     変数宣言 自動,文字列{ &抽出文字列 }
     変数宣言 自動,整数 { &multiTblNum }

     多重化
     &multiTblNum = #is表

     ジャンプ 行番号 = 先頭
    ┌繰り返し ( .not #eof )

    │┌if ( #is記号( [文字列], 0 ) ) /* if ( #is記号( [文字列], 0 ) <> 0 ) でも同じ */
    ││
    ││ 手続き実行 prc記号文字を抽出( [文字列], &抽出文字列 )
    ││ 行訂正 [記号文字抽出結果] = &抽出文字列
    │└end

    │ ジャンプ 行番号 = 次行
    └繰り返し終了

     終了 表 &multiTblNum

    手続き定義終了

    手続き定義開始 prc記号文字を抽出( 文字列 &string, 参照 文字列 &result )
     変数宣言 自動,文字列{ &chr }
     変数宣言 自動,整数 { &length }
     変数宣言 自動,整数 { &i, &loop, &step = 1 }

     &result = #u
     &length = #文字数( &string )
     &loop  = &length
    ┌繰り返し &i = 1, &loop, &step

    │ &chr = #sstr( &string, &i, 1 )
    │┌if ( #is記号( &chr, 0 ) )
    ││
    ││ &result = &result + &chr
    │└end

    └繰り返し終了

     トレース出力 _&string
     トレース出力 _&result

    手続き定義終了

引用返信 [メール受信/OFF] 削除キー/
■13798 / inTopicNo.6)  Re[2]: 文字列から記号のみ取り出ししたい
□投稿者/ まさやん -(2023/05/28(Sun) 19:02:50)
    2023/05/28(Sun) 19:17:31 編集(投稿者)
    2023/05/28(Sun) 19:14:08 編集(投稿者)
    2023/05/28(Sun) 19:13:13 編集(投稿者)

    先ほどの式では 

    重複した 記号が 1つしか抽出してくれませんでした
    なので


    &比較式="//123abc*#%/%%",&STR=""
    変数宣言 整数,{&文字位置}


    繰り返し
       条件 (#IS記号(&比較式,0)=0) 繰り返し中止
    if(#IS記号(&比較式,0)>0)
    &文字位置=#IS記号(&比較式,0)
          &置換式=#部分列(&比較式,#IS記号(&比較式,0),1)
    &STR=&STR+&置換式
          &比較式=#部分列(&比較式,&文字位置+1)
    end
    繰り返し終了
                変数書き出し "記号",{&STR},終了状態=&秒

    に変更します

    結果が    //*#%/%%  になりました
    追伸
    if end が要らないかもです。
引用返信 [メール受信/OFF] 削除キー/
■13799 / inTopicNo.7)  Re[1]: 文字列から記号のみ取り出ししたい
□投稿者/ いぶけん -(2023/05/28(Sun) 19:06:35)
    まさやんさん、ONnojiさん
    ありがとうございました。

    ダウンロードしました。
    自分の望み通りの動作です。
    本当に助かりました!
解決済み!
引用返信 [メール受信/OFF] 削除キー/
■13802 / inTopicNo.8)  Re[4]: 文字列から記号のみ取り出ししたい
□投稿者/ ONnoji -(2023/05/29(Mon) 14:26:06)
    2023/06/01(Thu) 11:18:21 編集(投稿者)

    ホントの蛇足

    アプローチとしては次の2通り考えられますね。

    ・文字列の先頭から末尾まで一文字ずつシフトして調べていく方法
    ・作業文字列の記号文字の位置を調べていく方法

    ご参考まで。(^^ゞ

     ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇ ◇

    ■文字列の先頭から末尾まで一文字ずつシフトして調べていく方法

    手続き定義開始 prc記号文字を抽出( 文字列 &string, 参照 文字列 &result )
     変数宣言 自動,文字列{ &chr }
     変数宣言 自動,整数 { &length }
     変数宣言 自動,整数 { &i, &loop, &step = 1 }

     &result = #u
     &length = #文字数( &string )
     &loop  = &lengtht
    ┌繰り返し &i = 1, &loop, &step

    │ &chr = #sstr( &string, &i, 1 )
    │┌if ( #is記号( &chr, 0 ) )
    ││
    ││ &result = &result + &chr
    │└end

    └繰り返し終了

     トレース出力 _&string
     トレース出力 _&result

    手続き定義終了


    ■作業文字列の記号文字の位置を調べていく方法

    手続き定義開始 prc記号文字を抽出2( 文字列 &string, 参照 文字列 &result )
     変数宣言 自動,文字列{ &workString, &chr }
     変数宣言 自動,整数 { &at }

     &workString = &string
     &result   = #u
    ┌繰り返し ( #is記号( &workString, 0 ) )

    │ &at   = #is記号( &workString, 0 )
    │ &chr  = #sstr( &workString, &at, 1 )
    │ &result = &result + &chr

    │ &workString = #sstr( &workString, &at + 1 )

    └繰り返し終了

     トレース出力 _&string
     トレース出力 _&result

    手続き定義終了

引用返信 [メール受信/OFF] 削除キー/



トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

Mode/  Pass/

HOME HELP 新規作成 新着記事 トピック表示 ファイル一覧 検索 過去ログ

- Child Tree -
- Antispam Version -