提取不同长度和位置的字符串我想从变量(Dx1)中提取字符串,但字符串的长度和位置各不相同,但它们之间用破折号分隔。 有时有多个破折号。 例如...
“7812-abcdef -9”
“v7892-xyz-0”
“812-fghkj-0”
“17361-gf-jhyt-9”
我想做的是创建一个新变量,用于提取第一个破折号之前的数字/字符,然后创建另一个变量,用于提取第一个破折号和第二个破折号之间的字符。所以,
变量1 变量2
第7812章
v7892 xyz
第812章
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
)
)
回复:提取不同长度和位置的字符串这正则表达式()如果您遇到稳定性或性能问题(并且列公式中无限的 while 循环可能会令人沮丧地进行调试),则 function 可能是一个有效的替代方案。
//Formula for Var1
Regex(Dx1, "(^.*?)-", "\1");
//Formula for Var2
Regex(Dx1, "-(.+)-\d", "\1");
回复:提取不同长度和位置的字符串再次感谢,吉姆。
我用过的行比这多得多。 这只是一个假设。
DX1 的每种情况都以数字结尾,但我为 Var2 提取的内容与该数字之间的空格数各不相同。 也许这就是造成它的原因。 不管怎样,你的解决方案有效。
回复:提取不同长度和位置的字符串对于 JMP 来说,65,000 行并不是一个很大的表来处理。JMP 可以处理包含数十亿行的数据表。问题是,数据表中的数据不一致。该代码假设在找到 Var2 的字符值后至少会找到一个数字字段。显然存在一种情况,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);
回复:提取不同长度和位置的字符串谢谢,吉姆。 我之前就是这样尝试的。 由于某种原因,当我运行 JMP Pro 13 时,它似乎崩溃了。 也许是因为我的数据表有65,000行?
回复:提取不同长度和位置的字符串包含的代码是列公式。我已附加一个数据表,其中包含您在示例中使用的 Dx1 列,以及指定了列公式的新 Var1 和 Var2 列。
回复:提取不同长度和位置的字符串谢谢,吉姆。 这就是我一直在寻找的。
我如何运行这个脚本? 我尝试将其作为列公式。 这并没有成功,但我没想到会成功。 我还打开了一个脚本窗口并在那里运行它,但它只是停止响应。回复:提取不同长度和位置的字符串这是一个公式,可以按照您所说的规则进行操作......
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”。那是你要的吗?
无论如何,我希望您能够看到,您可以构建尽可能复杂的公式,因为您可能需要将字符串解析为任何正确的值。唯一的限制是您需要能够确定需要使用的规则。
回复:提取不同长度和位置的字符串我能想到的唯一一致的规则是第二个单词出现在数字 (#) 之间。 最终我想要连字符之间的短语。 因此,“#-word -#”和“#-word-word -#”和“#-word-word word -#”
回复:提取不同长度和位置的字符串JSL 将允许构建和解析任何这些复杂的条件。由人类来决定这种解析的规则是什么。
在您的示例中,确定哪些连字符值应读取为组合值以及何时将它们视为单独值的规则是什么?
回复:提取不同长度和位置的字符串有没有办法让WORD忽略一些破折号? 我试图提取的第二个单词中的一些是连字符的,因此我只提取了部分内容。 例如,对于“938-ex-marine”,我得到“938”和“ex”,而不是“ex-marine”
回复:提取不同长度和位置的字符串这字函数是你的朋友。使用破折号和空格作为分隔符,您可以轻松提取您想要的内容。以下是在表中使用公式的示例:
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] ) )
);回复:提取不同长度和位置的字符串谢谢! 效果很好。
回复:提取不同长度和位置的字符串您想要使用 Word() 函数。如果您创建一个新列“Var1”,并将以下公式放入该列中,您将得到您想要的结果
word(1,:Dx1,"-")
对于 Var2 来说,它将是:
word(2,:Dx1,"-")
Word() 函数记录在脚本索引中
帮助==>脚本索引==>Word
回复:提取不同长度和位置的字符串@jswislar :
解决这个问题的一种方法是使用 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])));
);