將字符串中不同長度的數字提取到不同的列中我有一個名為 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" ) )