将字符串中不同长度的数字提取到不同的列中我有一个名为 Duration 的列,其值代表天数、小时数、分钟数和秒数。 最后一个 m 表示秒。
所以典型的格式是:(0-365)d(0-24)h(0-60)m(0-60)m
这里有些例子。:
0d 15h 47m 43m
10 天 10 小时 21 米 54 米
0d 04h 07m 32m
268d 06h 02m 33m
我需要提取不同列中的天数、小时数、分钟数和秒数,以便我可以对其执行计算。
我尝试了提取天数的公式,
Words( :Duration, "d" )[1]
为了提取第二个数字 - 我使用了公式:
Substr( Item( 2, :Duration ), 1, 2 );
以同样的方式在 Item 公式中使用 3 和 4 提取第三和第四个数字。
为了将这些字符串转换为数字,我又创建了 4 列;复制并粘贴并将数据类型更改为数字。
我知道这是获得结果的一种方式。
我想知道是否有人能以更有效的方式帮助我。
数据表脚本Re: 将字符串中不同长度的数字提取到不同的列中非常感谢您将我指向日志。 我在那里看到了结果。以前我以为结果会显示在一个单独的窗口中。
Re: 将字符串中不同长度的数字提取到不同的列中标记
我的印象是结果会显示在一个单独的窗口中。 现在,我查看了日志 - 我在那里看到了结果 - 就像我运行脚本的次数一样。
Re: 将字符串中不同长度的数字提取到不同的列中@txnelson是正确的。 他向您展示了如何将其用作单独的脚本。 此表达式是列公式所需的全部内容:
Num( Regex( cell[i], "(\d+)d (\d+)h (\d+)m (\d+)m", "\1" ) )
Re: 将字符串中不同长度的数字提取到不同的列中@马克贝利脚本是一个独立的 JSL。您可以通过将其放入脚本窗口并运行脚本来运行它。我这样做了,效果很好,在 JMP 日志中给出了以下结果
day = 0;
day = 10;
day = 0;
day = 268;
Re: 将字符串中不同长度的数字提取到不同的列中标记,
我尝试以多种不同方式使用您的脚本
a) 通过在脚本编辑器中使用脚本并运行它,
b) 创建一个名称为“cell”的列并在其中输入项目列表+创建另一列“day”并使用“for loop”作为该列中的公式,
和其他方式。
我得到一个错误。
我也试着在脚本索引中四处寻找帮助。
但我无法让脚本工作。我是脚本新手。 你能帮忙吗?
Re: 将字符串中不同长度的数字提取到不同的列中到目前为止,您已经获得了一些很好的解决方案,但我要指出的是,您对使用字()功能。
您可以在 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"};
它在公式编辑器中,连同在 Days()、In Hours()、In Minutes() 函数中将数值转换为每个单位的秒数,以创建持续时间列。

我在这里也附上了数据表。
本主题结合了我最喜欢的两个功能,即 Word()(或 Words())函数以及日期和时间。 以下是我写的解释每一个的帖子:
如果您只学习一个公式编辑器函数,Word() 就是一个
在 JMP 中使用日期、时间、日期时间和持续时间
Re: 将字符串中不同长度的数字提取到不同的列中保罗-我学到了一个新功能。 非常感谢您提供详细和简化的解决方案。!
Re: 将字符串中不同长度的数字提取到不同的列中完美。非常感谢您的描述和屏幕截图。 通过使用重新编码在其他情况下为我节省了时间。
Re: 将字符串中不同长度的数字提取到不同的列中使用 Recode -Formula Column - 在 New values 热点下选择 Advanced - Extract Segment。 提取 d、sec 和 jmp 文件的屏幕截图,其中附有已保存的天、小时、秒公式。


Re: 将字符串中不同长度的数字提取到不同的列中此示例说明如何使用正则表达式。
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 );
);Re: 将字符串中不同长度的数字提取到不同的列中附上样品表。
Re: 将字符串中不同长度的数字提取到不同的列中如何使用正则表达式:
当天:
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" ) )