将字符串中不同长度的数字提取到不同的列中我有一个名为“持续时间”的列,其中的值表示天数、小时数、分钟数和秒数。 最后的 m 表示秒。
所以典型的格式是:(0-365)d(0-24)h(0-60)m(0-60)m
这里有些例子。:
0天 15小时 47m 43m
10天10小时21m 54m
0天04小时07米32米
268d 06h 02m 33m
我需要提取不同列中的天数、小时数、分钟数和秒数,以便我可以对其进行计算。
我尝试了提取天数的公式,
Words( :Duration, "d" )[1]
为了提取第二个数字 - 我使用了公式:
Substr( Item( 2, :Duration ), 1, 2 );
以同样的方式使用 Item 公式中的 3 和 4 提取第三个和第四个数字。
为了将这些字符串转换为数字,我又创建了 4 列;复制并粘贴并将数据类型更改为数字。
我知道这是一种迂回的方式来达到结果。
我想知道是否有人可以帮助我以更有效的方式。
高级统计建模消费者和市场研究数据存取实验设计大规模定制质量和工艺工程分享和交流结果回复:将字符串中不同长度的数字提取到不同的列中非常感谢您向我指出日志。 我在那里看到了结果。以前我以为结果会显示在单独的窗口中。
回复:将字符串中不同长度的数字提取到不同的列中标记
我的印象是结果将显示在单独的窗口中。 现在,我查看了日志 - 我在那里看到了结果 - 与我运行脚本的次数一样。
回复:将字符串中不同长度的数字提取到不同的列中@tx尼尔森是正确的。 他向您展示了如何将其用作单独的脚本。 此表达式是列公式所需的全部内容:
Num( Regex( cell[i], "(\d+)d (\d+)h (\d+)m (\d+)m", "\1" ) )
回复:将字符串中不同长度的数字提取到不同的列中@马克贝利脚本是一个独立的 JSL。您可以通过将其放入脚本窗口并运行脚本来运行它。我这样做了,效果很好,在 JMP 日志中给出了以下结果
day = 0;
day = 10;
day = 0;
day = 268;
回复:将字符串中不同长度的数字提取到不同的列中标记,
我尝试以多种不同的方式使用你的脚本
a) 通过在脚本编辑器中使用脚本并运行它,
b)创建一个名为“cell”的列并在其中输入项目列表+创建另一列“day”并使用“for循环”作为该列中的公式,
和其他方式。
我收到一个错误。
我也尝试在脚本索引中查找帮助。
但我无法让脚本工作。我是脚本编写新手。 你能帮忙吗?
回复:将字符串中不同长度的数字提取到不同的列中到目前为止,您已经得到了一些很好的解决方案,但我想指出的是,您非常接近使用字()功能。
您可以在 Words() 函数的最后一个参数中指定多个分隔符,以便您可以执行以下操作:
vals={"0d 15h 47m 43m", "10d 10h 21m 54m","0d 04h 07m 32m", "268d 06h 02m 33m"};
for (i=1, i<=nitems(vals), i++,
show(words(vals[i], "dhm ")) //use "d" "h" "m" and a space as delimiters
);
在日志中:
/*:
Words(vals[i], "dhm ") = {"0", "15", "47", "43"};
Words(vals[i], "dhm ") = {"10", "10", "21", "54"};
Words(vals[i], "dhm ") = {"0", "04", "07", "32"};
Words(vals[i], "dhm ") = {"268", "06", "02", "33"};
它位于公式编辑器中,以及以天()、以小时()、以分钟()为单位函数将数值转换为每个单位的秒数,以创建“持续时间”列。

我也在这里附上了数据表。
本主题结合了我最喜欢的两个功能:Word()(或 Words())函数以及日期和时间。 以下是我写的帖子,对它们进行了解释:
如果您只学习一种公式编辑器函数,Word() 就是其中之一
在 JMP 中使用日期、时间、日期时间和持续时间
回复:将字符串中不同长度的数字提取到不同的列中保罗-我学到了一个新功能。 非常感谢您提供详细且简化的解决方案版本。!
回复:将字符串中不同长度的数字提取到不同的列中完美。非常感谢您的描述和屏幕截图。 在其他情况下,使用重新编码节省了我的时间。
回复:将字符串中不同长度的数字提取到不同的列中使用重新编码 - 公式列 - 在新值热点下选择高级 - 提取段。 提取 d、sec 和 jmp 文件的屏幕截图,并附有保存的日、小时、秒公式。


回复:将字符串中不同长度的数字提取到不同的列中此示例说明了如何使用正则表达式。
Names Default To Here( 1 );
cell = {"0d 15h 47m 43m", "10d 10h 21m 54m", "0d 04h 07m 32m", "268d 06h 02m 33m"};
For( i = 1, i <= N Items( cell ), i++,
day = Num( Regex( cell[i], "(\d+)d (\d+)h (\d+)m (\d+)m", "\1" ) );
Show( day );
);回复:将字符串中不同长度的数字提取到不同的列中附样本表。
回复:将字符串中不同长度的数字提取到不同的列中使用正则表达式怎么样:
当日:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\1" ) )
一小时:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\2" ) )
就分钟而言:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\3" ) )
对于第二个:
Num( Regex( :Duration, "(\d+)d\s(\d+)h\s(\d+)m\s(\d+)m", "\4" ) )
每个数字都在一个捕获组中,尽管您实际上不需要捕获其他数字。 你可以用这些来简化它:
Num( Regex( :Duration, "(\d+)d\s\d+h\s\d+m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s(\d+)h\s\d+m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s\d+h\s(\d+)m\s\d+m", "\1" ) )
Num( Regex( :Duration, "\d+d\s\d+h\s\d+m\s(\d+)m", "\1" ) )