截斷字符串<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />我有多個數據表,其中包含一個名為“在版本中找到”的列。主要版本通常是 4 位數字——次要版本有時會在主要版本號的末尾附加一個字母字符。出於繪圖的目的,我不想顯示次要版本 --- 相反,我想將次要版本與其關聯的主要版本合併。例如...如果主要版本是 5.1.2.1 那麼我希望次要版本 5.1.2.1a 也被稱為 5.1.2.1 .....
在混合中拋出另一個皺紋----我可能還想將所有 5.1.2.x 轉換為 5.1.2---- 所以 5.1.2.0、5.1.2.2a、5.1.2.3、5.1.2.4a等...將成為版本 5.1.2
當前列為‘Character’、‘Nominal’……我正在考慮根據需要/期望的詳細程度將列中的字符串“截斷”為 7 個字符或 5 個字符 --- 但我不確定該怎麼做,或者是否有更好的方法。
此外 --- 我從不同的團隊接收數據表 --- 每個團隊似乎都有不同的版本控制方案 --- 因此必須內置靈活性 ----- 不確定我是否必須分析每個數據element s,並比較常見字符以查看它們是否“屬於”同一版本???

回复:截斷字符串這裡的答案非常有幫助,讓我覺得我可能把它弄得太複雜了——所以我嘗試了字符函數“左”,但上周無法讓它工作……我的語法一定是“關閉”了 --- 因為它今天對我有用..
| 對於每一行(:在 Vers Truncated 中找到=左(:在版本中找到,7)); |
---- 這只是將字符串截斷到最左邊的字符......這將去除較小版本的字符 --- 因為來自不同團隊的版本號不一致(一些團隊使用 4 位數字附加字母字符,有些使用沒有附加字母字符的 3 位數字)我認為這種方法可能有效,但我必須測試使用哪個版本方案來確定截斷級別....
回复:截斷字符串我認為正則表達式 (regex()) 可以解決這個問題。
Newcolumn("在主要版本中找到",字符,標稱,
公式(正則表達式(:在版本中找到,“。*?(\d+\.\d+\.\d+)。*”,“\1”)
);
".*?(\d+\.\d+\.\d+).*" 表示找到足夠的任何東西,.*?,後跟任意長度的數字,\d+,一次十進制,\.,一個數字任意長度,\d+,小數一次,\. ,任意長度的數字,\d+,後跟任何內容。 只返回括號中的部分,數字和小數,\1。
對於次要版本,將正則表達式 (regex()) 更改為多一位小數和數字。
Newcolumn("在次要版本中找到",字符,標稱,
公式(正則表達式(:在版本中找到,“。*?(\d+\.\d+\.\d+\.\d+)。*”,“\1”)
);
回复:截斷字符串另一方面,這是 ETL 的核武器,保證可以處理所有事情,但工作量更大。 如果您的不同供應商遵循截然不同的流程,您可能會發現這是唯一的選擇。
只需為每個供應商創建一個唯一的一致性表:
數據有;
長度 FoundInVersion $32;
輸入 FoundInVersion $;
牌;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9奇怪
跑步;
數據master_conversion;
長度 FoundInVersionGood FoundInVersion $32;
輸入 FoundInVersionGood $ FoundInVersion $;
牌;
5.1.2 5.1.2.1
5.1.2 5.1.2.2
5.2.2 5.2.2.2a
5.2.2 5.2.2.3
5.2.2 5.2.2.3x
5.2.2 5.2.2.9
5.2.2 5.2.2.9奇怪
跑步;
進程 sql;
創建表想要作為
選擇 FoundInVersionGood 作為 FoundInVersion
來自 master_conversion 內連接
有 (master_conversion.FoundInVersion = have.FoundInVersion);
辭職;
湯姆
回复:截斷字符串抱歉使用 SAS 代碼,因為我不是 JMP 用戶……也許 JMP 中存在等效函數?
這非常簡單也非常愚蠢,所以數據必須非常一致:
數據有;
長度 FoundInVersion $32;
輸入 FoundInVersion $;
牌;
5.1.2.1
5.1.2.2
5.2.2.2a
5.2.2.3
5.2.2.3x
5.2.2.9
5.2.2.9奇怪
跑步;
數據需要;
長度 FoundInVersionGood $32;
設置有;
/* 使用句點作為分隔符,掃描第一個、第二個和第三個單詞 (SCAN),然後將它們與句點 (CATX) 連接起來。 */
/* 假設總會有至少三個級別 */
FoundInVersionGood = catx(".", 掃描(FoundInVersion,1,"."), 掃描(FoundInVersion,2,"."), 掃描(FoundInVersion,3,"."));
跑步;
湯姆
回复:截斷字符串這樣就可以了。遍歷所有值並使用正則表達式來測試每個值。
dt =當前數據表() ;
dt <<新專欄( “發現在 Vers Truncated” ,特點,名義上的) ;
為了(我= 1個,我<=行( dt ) ,我++,
測試值=柱子( dt , “在版本中找到” )[我] ;
// 查看最後一個字符是否是 a 到 z 之一
如果(不見了(正則表達式(測試值, “[az]$” )) ,
// 然後
柱子( dt , “發現在 Vers Truncated” )[我] =測試值;
,
// 別的
one_length =長度(測試值) ;
柱子( dt , “發現在 Vers Truncated” )[我] =子字符串(測試值, 1個, ( one_length - 1個)) ;
) ;
) ;
回复:截斷字符串你好,
不確定這是否是您想要的:
數據有;
輸入 old :$10.;
牌;
5.1.2
5.1.2.1
5.1.2.1e
;
數據需要;
新長度 $5;
設置有;
新=舊;
跑步;
過程打印;運行;
海闊