さまざまな長さと位置の文字列を抽出する変数(Dx1)から文字列を抽出したいのですが、文字列の長さや位置は異なりますが、ダッシュで区切られています。 複数のダッシュがある場合もあります。 例えば...
「7812-abcdef-9」
「v7892-xyz -0」
「812-fghkj -0」
「17361-gf-jhyt-9」
私がやりたいのは、最初のダッシュの前の数字/文字を抽出する新しい変数を作成し、次に最初と 2 番目のダッシュの間の文字を抽出する別の変数を作成することです。それで、
バージョン1 バージョン2
7812 abcdef
v7892xyz
812 fghkj
17361 GF-JHYT
ここに投稿された例に従ってみましたが、ダッシュが抽出されただけでした。 +1 を別の数値に変更すると、その数の文字が抽出されますが、データの長さは異なります。
https://community.jmp.com/t5/Uncharted/JSL-Character-String-Functions/ba-p/21323
これが私が書いたものです。 私の何が間違っているのでしょうか?
Trim(
Substr(
:Name( "Dx1" ),
Contains( :Name( "Dx1" ), "-" ),
1
)
)
Re: 長さや位置が異なる文字列を抽出したいの正規表現()安定性やパフォーマンスの問題が発生した場合 (また、列の数式で無限になる while ループはデバッグにイライラする可能性があります)、関数はここでの効率的な代替手段となる可能性があります。
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
Re: 長さや位置が異なる文字列を抽出したい改めて感謝します、ジム。
これよりもさらに多くの行を使用しました。 それは単なる仮説でした。
DX1 のすべてのケースは数字で終わりますが、Var2 で抽出しているものとその数字の間にあるスペースの数は異なります。 もしかしたらそれが原因だったのかもしれません。 いずれにせよ、あなたの解決策はうまくいきました。
Re: 長さや位置が異なる文字列を抽出したい65,000 行は、JMP が処理できるほど大きなテーブルではありません。JMP は、数十億行のデータ テーブルを処理できます。問題は、データテーブル内のデータの不整合です。このコードは、Var2 の文字値を見つけた後に少なくとも 1 つの数値フィールドが見つかることを前提としています。どうやら、Dx1 の値が数字で終わらない状況があるようです。以下は、その問題を調整するための形式の変更です。
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1 & Word( i, :Dx1, "-" ) != "",
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
Re: 長さや位置が異なる文字列を抽出したいありがとう、ジム。 それが私が以前試した方法です。 何らかの理由で、JMP Pro 13 を実行するとクラッシュするようです。 私のデータテーブルが 65,000 行だからでしょうか?
Re: 長さや位置が異なる文字列を抽出したい含まれているコードは列式です。例で使用した Dx1 列と、列式が指定された新しい Var1 列と Var2 列を含むデータ テーブルを添付しました。
Re: 長さや位置が異なる文字列を抽出したいありがとう、ジム。 それが私が探していたものです。
このスクリプトを実行するにはどうすればよいですか? 列の式として試してみました。 それはうまくいきませんでしたが、うまくいくとは予想していませんでした。 また、スクリプト ウィンドウを開いて実行しましたが、応答が停止しました。Re: 長さや位置が異なる文字列を抽出したいこれは、ルールとして述べたことを実行する式です...
Final_Value = Word( 2, :Dx1, "-" );
i = 3;
(While( Is Missing( Num( Word( i, :Dx1, "-" ) ) ) == 1,
Final_Value = Final_Value || "-" || Word( i, :Dx1, "-" );
i++;
) ; Final_Value);
ただし、上記のサンプルでは、サンプル「17361-gf-jhyt -9」の Var2 値は「gf-jhyt」になります。それがあなたが望むことですか?
いずれにせよ、文字列を正しい値に解析するために必要な複雑な数式を構築できることがわかっていただけたでしょうか。唯一の制限は、使用する必要があるルールを決定できる必要があることです。
Re: 長さや位置が異なる文字列を抽出したい私が考えることができる一貫性のある唯一のルールは、2 番目の単語が数字 (#) の間に現れるということです。 最終的にはハイフン間のフレーズが必要です。 つまり、「#-word -#」と「#-word-word -#」と「#-word-word word -#」になります。
Re: 長さや位置が異なる文字列を抽出したいJSL を使用すると、これらの複雑な条件の構築と解析が可能になります。このような解析のルールを決定するのは人間の責任です。
あなたの例では、どのハイフンで囲まれた値を結合された値として読み取るべきか、またそれらをいつ個別の値として扱うかを決定するルールは何ですか?
Re: 長さや位置が異なる文字列を抽出したいWORD で一部のダッシュを無視する方法はありますか? 抽出しようとしている 2 番目の単語の一部はハイフンでつながれているため、部分的にのみ抽出されます。 たとえば、「938-ex-marine」の場合、「ex-marine」ではなく「938」と「ex」が表示されます。
Re: 長さや位置が異なる文字列を抽出したいの言葉ここでは関数があなたの友達です。ダッシュとスペースを区切り文字として使用すると、必要な内容を簡単に抽出できます。テーブル内で数式を使用する例を次に示します。
dt = New Table( "Untitled", Add Rows( 4 ),
New Column( "dx1", Character, "Nominal",
Set Values( {"7812-abcdef -9", "v7892-xyz -0", "812-fghkj -0",
"17361-gf-jhyt -9"}
)
),
// Get the first word for Var1
New Column( "Var1", Character, "Nominal", Formula( Words( :dx1, "- " )[1] ) ),
// Get the second word for Var1
New Column( "Var2", Character, "Nominal", Formula( Words( :dx1, "- " )[2] ) )
);Re: 長さや位置が異なる文字列を抽出したいありがとう! それはうまくいきます。
Re: 長さや位置が異なる文字列を抽出したいWord()関数を使用したいと考えています。新しい列「Var1」を作成し、その列に以下の数式を入力すると、必要な結果が得られます。
word(1,:Dx1,"-")
Var2 の場合は次のようになります。
word(2,:Dx1,"-")
Word() 関数については、Scripting Index に記載されています。
ヘルプ==>スクリプトインデックス==>Word
Re: 長さや位置が異なる文字列を抽出したい@jswislar :
これに対処する 1 つの方法は、Contains 関数と Substr 関数を使用することです。
a = {"abc-12","abc - 45","abc- 89"};
List1 = list();
List2 = list();
For(i = 1 , i <= N Items(a), i++,
Pos = Contains(a[i],"-");
Insert Into(List1,Substr(a[i],1,Pos-1));
Insert Into(List2,Substr(a[i],Pos+1,Length(a[i])));
);