从字符串中提取文本你好,
如果可能的话,我想从字符串中提取特定文本:
\\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)
我想从上面提取 ID:
CTL1083.1
CIL0858.1
CTL1077.1
CMA0851.1
CMS0499.1
CTL1078
CTLR1073
CTLR0999.1
CTL1008.1
任何帮助表示赞赏。
谢谢,
托马斯
质量和工艺工程回复:从字符串中提取文本嘘!@Craige_Hales ,请不要告诉@Byron_JMP 。 你真的会伤害他的感情。 (怕脸皮薄)
回复:从字符串中提取文本你说模式匹配? 这个怎么样
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 !)。 它速度极快且紧凑。 为了解释上面的代码,拍拍比赛正在寻找一个左括号,后跟一个或多个字符字符集后跟右括号或回车符。 结果来自帕特·斯潘都存储在变量中下一个ID 。 每次发现模式时,帕特测试用于将其插入id列表。 这0在......的最后帕特测试允许您从紧接在匹配字符串中最后一个字符之后(但在下一个字符之前)的位置继续搜索输入字符串。 如果最后一条语句帕特测试如果计算结果为 true(任何非 0),则搜索将结束,仅返回第一个匹配项。
回复:从字符串中提取文本我喜欢 word() 或 Words() 工作时的简单性。 我写过关于芒格的文章这里并且不再了解如何使用它。 我认为它出现在 JMP 中是因为它于 1990 年在 Mac 上可用……而不是因为它是操作字符串的好方法的示例。
回复:从字符串中提取文本非常好,所有的建议都很有效。
我在我的剧本中使用了芒格,效果非常好。
多谢
托马斯
回复:从字符串中提取文本哇,JMP 中有很多切片面包的方法。
回复:从字符串中提取文本@pmroz ,你的代码看起来总是比我的更随意; )
子字符串(substr)是一种更直接的方法,我只是无法抗拒芒格的好例子。
Craig Hales 可能有一些使用模式匹配的更有效的方法。 我确信社区页面或他的博客页面中已经有一些示例。
回复:从字符串中提取文本我喜欢用于此类字符串提取的“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], "()" ) )
);回复:从字符串中提取文本如果您喜欢正则表达式......(注:清理仓促编写的代码并于 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 );
回复:从字符串中提取文本我用子字符串以获得类似的效果。
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);
);回复:从字符串中提取文本解决方案来自@pmroz很坚固,不错!
一种稍微不同的方法可能是使用数据表中的公式

起始分隔符的位置可以通过“Contains”参数来定位
Contains(:text, "(")
结束分隔符的位置可以用同样的方式定位
Contains( :text, ")" )
一个晦涩但非常有趣的参数“munger”可用于提取分隔符位置之间的字符串。
在本例中,我们需要分隔符之后的字符串,在结束分隔符之前结束的字符串,因此在开头加 1,在结尾减 1。
在这种情况下, munger 的函数使用参数、整个文本、从哪里开始、返回多少个字符。 芒格还可以做一些其他有趣的事情,比如查找和替换。
Munger( :text, :start + 1, (:stop - :start) - 1 )
将所有这些包装到一个公式中看起来像这样
Munger(
:text,
Contains( :text, "(" ) + 1,
(Contains( :text, ")" ) - Contains( :text, "(" )) - 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]);
);