2013-10-19 135 views
1

所以在SAS中,我有一個長度爲10個字符的變量fooword。我想做到的是,當應用自定義格式的每兩個符號後顯示如何將短劃線符號插入字符變量(SAS)?

format fooword $fooformat.; 

破折號符號(從右到左)。換句話說BERRY會是什麼樣子B-ER-RY草莓會是什麼樣子ST-RA-WB-ER-RY

當然,我可以創建一個新的更長的變量,並通過使用一堆substr()添加破折號,但看起來像在我眼中的一個可怕的解決方案。

所以......

proc format; 
    value $fooformat 
    ??? 
    ; 
run; 
+0

我會 - 愉快地 - 驚訝如果這是可能的。自定義格式是轉換爲靜態值(靜態as-in:預定義)。如果你希望你的功能可以靈活使用,最好考慮編寫你的自定義函數或者一個小宏。如果你只需要一次,就把它寫成數據步驟(的一部分)。 – mvherweg

+0

我不認爲你可以用一種格式來做到這一點,但我敢打賭你可以用正則表達式。找到正確的正則表達式,在每個雙字符序列後插入破折號,然後在SAS中使用PRXCHANGE函數。對不起,我自己並不知道正則表達式,但我敢打賭,如果你修改了這個問題並添加了「正則表達式」標籤,你會得到很多答案。 – BellevueBob

回答

1

不可能的格式,可悲。可以使用FCMP函數或正則表達式。可能工作正則表達式會像這樣:

data test; 
length origtext fintext $50; 
input origtext $; 
fintext=prxchange('s/([a-z]{2})(?=[a-z])/$1-/io',-1,origtext); 
put origtext= fintext=; 
datalines; 
BLACKHOLES 
GRAVITYWELL 
DOREMIFASOLATI 
;;;; 
run; 

看起來2個字母字符,那麼另一個字母字符積極前瞻(所以它不會拋出一個到終點),然後用相同再加上取代短跑。您可以創建一個FCMP函數,或者完成此操作,或者只是遍歷字符串來重複遍歷整個破折號。如果不是實際的細節,那將更類似於使用的格式。

相關問題