從字符串中提取文本你好,
如果可能的話,我想從字符串中提取特定的文本:
\\swirt.misc@CAS-K-CLERK\K10447-Wit_OG 嗨 TT-YYT (CTL1083.1)_172-7-10053 -303
\\swirt.misc@CAS-K-CLERK\K10445-Wit_OG 嗨 ES WERT (CIL0858.1)_172-7-10046-600
\\swirt.misc@CAS-K-CLERK\K10437-Wit_OG 嗨 TT-YYT (CTL1077.1)_172-7-10053-303
\\swirt.misc@CAS-K-CLERK\K10420-Wit_OG 嗨 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 嗨 YYT DEV-020856 (CTLR1073
\\swirt.misc@CAS-K-CLERK\K10022 -Wit_OG 嗨 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
任何幫助表示讚賞。
謝謝,
托馬斯
腳本回复:從字符串中提取文本使用帶有 ( 和 ) 作為分隔符的 WORDS 函數。使用返回列表中的第二個元素。運行下面的代碼並檢查日誌窗口中的輸出。
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]);
);回复:從字符串中提取文本解決方案來自@pmroz很健壯,不錯!
稍微不同的方法可能是在數據表中使用公式

起始分隔符的位置可以通過“包含”參數定位
Contains(:text, "(")
結束分隔符的位置可以以相同的方式定位
Contains( :text, ")" )
一個晦澀但非常有趣的參數“munger”可用於提取分隔符位置之間的字符串。
在這種情況下,我們想要分隔符之後的字符串,它在結束分隔符之前結束,因此將 1 添加到開頭並從結尾減去。
在這種情況下,munger 的函數使用參數,整個文本,從哪裡開始,返回多少個字符。 Munger 還可以做一些其他有趣的事情,比如查找和替換。
Munger( :text, :start + 1, (:stop - :start) - 1 )
將所有這些包裝成一個公式看起來像這樣
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 1
)
回复:從字符串中提取文本我用SUBSTR為了類似的效果。
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);
);回复:從字符串中提取文本如果您喜歡正則表達式...
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 );
id = List();
// iterate over list and return target strings
For Each( { string }, sample,
If( Contains( string, ")" ),
Insert Into( id, Regex( string, "(.+\()(.+)(\).*)", "\2" ) ),
Insert Into( id, Regex( string, "(.+\()(.+)", "\2" ) )
);
);
Show( id );回复:從字符串中提取文本我喜歡這種字符串提取的“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], "()" ) )
);回复:從字符串中提取文本@pmroz ,你的代碼看起來總是比我的要少得多; )
子串(substr) 是一種更直接的方法,我只是無法抗拒munger 的好案例。
Craig Hales 可能有一些使用模式匹配的更有效的方法。 我確信社區頁面或他的博客頁面中已經有一些示例。
回复:從字符串中提取文本哇,在 JMP 中有很多切麵包的方法。
回复:從字符串中提取文本非常好,所有的建議都很有效。
我在我的腳本中使用了芒格並且效果很好。
非常感謝
托馬斯