文字列からテキストを抽出するこんにちは、
可能であれば、文字列から特定のテキストを抽出したいと思います。
\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG ローハイ TT-YYT (CTL1078)
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073)
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG ロハイ TT-YYT (CTL1008.1)
上記から ID を抽出したいと思います。
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
助けていただければ幸いです。
ありがとう、
トマシュ
品質およびプロセスエンジニアリングRe: 文字列からテキストを抽出するしー!@Craige_Hales 、言わないでください@バイロン_JMP 。 あなたは本当に彼の気持ちを傷つけることになります。 (皮膚が薄いのが怖いです)
Re: 文字列からテキストを抽出するパターンマッチングって言うんですか? これはどう
Names Default to Here(1);
sample = "\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
charSet = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890.";
idList = {};
Pat Match(sample,"(" + Pat Span(charSet)>>nextID + (")" | "\!r") + Pat Test(Insert Into(idList,nextID);0));
残念なことに、パターン マッチングの使用方法を学習するためのサポート ドキュメントがこれ以上ありません。 私は、「正規表現があるのに、なぜわざわざパターン マッチングをする必要があるの?」と思いました。私がそれをよりよく理解し、感謝し始めるまでは、その人でした(ありがとう) @Craige_Hales !)。 驚くほど高速かつコンパクトです。 上記のコードを説明すると、パットマッチ開き括弧の後に 1 つ以上の文字が続くものを探しています。文字コードその後に右括弧または復帰が続きます。 からの結果パット・スパン変数に格納されます次のID 。 パターンが見つかるたびに、パットテストに挿入するために使用されますidリスト。 の0の終わりにパットテスト一致した文字列の最後の文字の直後 (ただし、次の文字の前) の位置から入力文字列の検索を続けることができます。 最後のステートメントがパットテストtrue (0 以外) と評価された場合、検索は終了し、最初の一致のみが返されます。
Re: 文字列からテキストを抽出する私は word() または Words() が機能するときのシンプルさが気に入っています。 マンガについて書きましたここそしてもう使い方が分かりません。 JMP が入っているのは、それが 1990 年に Mac で利用可能になったからだと思います。文字列を操作する良い方法の一例だったからではありません。
Re: 文字列からテキストを抽出するとても素晴らしいです。すべての提案が魔法のように機能します。
私はスクリプトで Munger を使用しましたが、完璧に機能します。
どうもありがとう
トマシュ
Re: 文字列からテキストを抽出するJMP でパンをスライスする方法はたくさんあります。
Re: 文字列からテキストを抽出する@pmrozあなたのコードはいつも私のコードよりずっと無計画に見えます。 )
部分文字列 (substr) は、より単純なアプローチです。私は、不正行為に適したケースには抵抗できません。
Craig Hales はおそらく、パターン マッチングを使用したさらに効率的なアプローチをいくつか考えています。 コミュニティ ページや彼のブログ ページにはすでにいくつかの例があると思います。
Re: 文字列からテキストを抽出するこのような文字列抽出には「Word()」関数が好きです
Names Default To Here( 1 );
dt = New Table( "Test Words",
Add Rows( 9 ),
New Column( "Column 1",
Character,
"Nominal",
Set Values(
{"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
For( i = 1, i <= N Rows( dt ), i++,
Print( Word( 2, dt:column 1[i], "()" ) )
);Re: 文字列からテキストを抽出する正規表現に興味がある場合は...(注: 急いで書かれたコードをクリーンアップし、2022 年 1 月 12 日に以下のリストを置き換えました)
Names Default To Here( 1 );
// make list of example original strings
sample =
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600
\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600
\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078
\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)
\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)";
sample = Words( sample, "\!U000D" );
// Show( sample );
n = N Items( sample );
// iterate over list and return target strings
id = List();
For Each( {string}, sample, Insert Into( id, Regex( string, If( Contains( string, ")" ), "(.+\()(.+)(\).*)", "(.+\()(.+)" ), "\2" ) ) );
Show( id );
Re: 文字列からテキストを抽出する私が使うサブストラ同様の効果が得られます。
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
start = contains(one_value, "(") + 1;
end = contains(one_value, ")") - 1;
len = end - start + 1;
result = substr(one_value, start, len);
print(result);
);Re: 文字列からテキストを抽出するからの解決策@pmrozとても丈夫で、いいですね!
少し異なるアプローチは、データ テーブルで数式を使用することです。

開始区切り文字の位置は、「Contains」引数を使用して特定できます。
Contains(:text, "(")
終了デリミタの位置も同じ方法で見つけることができます
Contains( :text, ")" )
あいまいですが非常に楽しい引数「munger」を使用して、区切り文字の位置間の文字列を抽出できます。
この場合、区切り文字の後の文字列が、終了区切り文字より前で終了するようにしたいので、先頭に 1 が加算され、末尾から 1 が減算されます。
この場合の munger 関数は、引数、テキスト全体、開始位置、返す文字数を使用します。 Munger は、検索や置換など、他の興味深いことも実行できます。
Munger( :text, :start + 1, (:stop - :start) - 1 )
これらすべてを 1 つの式にまとめると次のようになります
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
Re: 文字列からテキストを抽出する( と ) を区切り文字として WORDS 関数を使用します。返されたリストの 2 番目の要素を使用します。以下のコードを実行し、ログ ウィンドウの出力を確認します。
dt = New Table( "Test Words", Add Rows( 9 ),
New Column( "Column 1", Character, "Nominal",
Set Values(
{
"\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG lo hi TT-YYT (CTL1083.1)_172-7-10053 -303",
"\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG lo hi ES WERT (CIL0858.1)_172-7-10046-600",
"\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG lo hi TT-YYT (CTL1077.1)_172-7-10053-303",
"\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG lo hi ES TRTR (CMA0851.1)_172-7-10047-600",
"\\swirt.misc@CAS-K-CLERK\K10377-Wit_OG_lo hi_ES_SI (CMS0499.1)_ 172-7-10041-600",
"\\swirt.misc@CAS-K-CLERK\K10451-Wit_OG lo hi TT-YYT (CTL1078",
"\\swirt.misc@CAS-K-CLERK\K10468-Wit_OG lo hi YYT DEV-020856 (CTLR1073",
"\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG lo hi YYT DEV-020414 (CTLR0999.1)",
"\\swirt.misc@CAS-K-CLERK\K10030-Wit_OG lo hi TT-YYT (CTL1008.1)"}
),
Set Display Width( 583 )
)
);
for (i = 1, i <= nrows(dt), i++,
one_value = dt:column 1[i];
word_list = words(one_value, "()");
print(word_list[2]);
);