みんなに優しく、解りやすくをモットーに開設しています。 以下のルールを守りみんなで助け合いましょう。
1.ファイルメーカーで解らない事があればここで質問して下さい。 何方でも、ご質問・ご回答お願いします。 (優しく回答しましょう)
You are not logged in.
Pages: 1
例えば、下記のようにそれぞれ改行区切りのデータがあるとします。
"パンツ大人用
パンツ子供用
パンツ赤ちゃん用"
このようなデータから"パンツ"という共通ワードを取り出したいのですが、いい方法はありますでしょうか?
各行の先頭の文字から前方一致で共通部分のみを取り出したいです。
行数も文字数もバラバラです。
v18です。
Last edited by やまほん (2020-03-14 10:42:15)
Offline
While (
[
txt = text ;
len = Int ( Length ( txt ) / ValueCount ( txt ) )
] ;
ValueCount ( UniqueValues ( txt ) ) > 1 ;
[
txt =
While (
[
txt0 = "" ;
n = ValueCount ( txt )
] ;
n ;
[
txt0 = List ( txt0 ; Left ( GetValue ( txt ; n ) ; len ) ) ;
n = n - 1
] ;
txt0
) ;
len = len - 1
] ;
GetValue ( txt ; 1 )
)
スタートする桁数に悩みますが、各桁数の平均から始めてみました。最小桁数から始めるのが理想ですが、さらにloopが必要になりますので。
Last edited by Shin (2020-03-14 15:17:12)
Offline
v18だけど、従前のループ式を入れ子使いにしてWループ計算で求める方法、
【計算手順】
1項目づつ取り出して、ピラミッド分解
パンツ大人用
↓
パ
パン
パンツ
パンツ大
パンツ大人
パンツ大人用
前後のピラミッド分解結果をリスト比較して共通文字列を抽出する
(前ピラミッド:パ¶パン¶パンツ¶パンツ大¶パンツ大人¶パンツ大人用)
(後ピラミッド:パ¶パン¶パンツ¶パンツ子¶パンツ子供¶パンツ子供用)
↓
(共通項一覧: パ¶パン¶パンツ) → (共通文字列:パンツ)
以上を末尾項まで繰り返しループ計算
最後まで来たら、「全件に渡る共通ワードか」を最終チェックして、全件の時のみ結果を書き出します。
Let(
[
$SUB= /*サブルーチン:ピラミッド生成*/
"Case($j=Length($itm); $r;
Let([
$j=$j+1;
$r=List($r; Left($itm;$j))
]; Evaluate($SUB))
)";
$FNC=
"Case(
$i=ValueCount($txt)
; Case(PatternCount($res;$key) and ValueCount($res)=ValueCount($txt)-1; $key)
; Let([
$i=$i+1;
#itm1=$itm;
#itm2=Let([$j=0;$r="""";$itm=GetValue($txt;$i)];Evaluate($SUB));
#key=FilterValues(#itm1;#itm2);
#key=GetValue(#key;ValueCount(#key));
$key=Min($key; #key);
$res=List($res; #key);
$itm=#itm2
]; Evaluate($FNC))
)"
];
Let([$txt=データ;$i=0;$res="";$key="";$itm=""]; Evaluate($FNC))
)
Last edited by Hiro (2020-03-15 21:40:28)
Offline
Shinさん、
桁数の説明不足、すみません。
極端な文字数パターンの時、うまくいかないパターンもほんの少しありましたが、
ほとんど期待通りの結果を得ることができました。
Hiroさん、
ピラミッド分解して照合するような式は思いつきませんでした。
私はこういった式が苦手なので、じっくり解読して勉強させていただきます。
こういった式を書けるように頑張ります。
Shinさん、Hiroさん、いつも唐突な質問にご丁寧にお答えいただきまして感謝です。
今回も本当に助かりました。ありがとうございました。
Offline
Pages: 1
[ Generated in 0.007 seconds, 10 queries executed - Memory usage: 509.72 KiB (Peak: 514.26 KiB) ]