2016-01-20 41 views
1

很長一段時間的讀者,首次海報從文本中提取串6,8位數字在SAS

我看過的答案,但沒有什麼是我的技術範圍之內轉換成一個解決方案。我會很感激任何幫助!


我試圖從SAS中的文本數據集中提取數字,所以在ProcSQL或DATAstep中。我想從自由文本字段返回數字組。

此字段包含:

  • 一個8位數字
  • 以上和6位的數量,這有時是分成2組由各種標點符號
  • 既不

- 在文字中的任何一點,有或沒有文字,任何一邊,任何長度。例如:

REC NOTES 

001 Collateral 83948572 (code 56/56-55) open June 2013 

002 Scoobydoo 12.12.12 88888888 

003 54545454 over three years 

我想提取到輸出:

8-digit no. if present  | 6-digit no. if present 

83948572     | 565655 
88888888     | 121212 
54545454     | 

任何人都可以建議我可能看起來的方向?

回答

0

試試這個:

data have; 
input REC $ NOTES $60.; 
temp=prxchange('s/[a-z]+//i',-1,notes); 
do i=1 to countw(temp); 
    num=compress(scan(temp,i,' '),,'kd'); 
    if length(num)=8 then num8=num; 
    else if length(num)=6 then num6=num; 
end; 
drop notes num i temp; 
cards; 
001 Collateral 83948572 (code 56/56-55) open June 2013 
002 Scoobydoo 12.12.12 88888888 
003 54545454 over three years 
; 
proc print ; 
run; 
+0

您應該至少提供一段代碼的最簡單解釋。例如,OP可能不熟悉該正則表達式函數。 – floydn

0

使用SUBSTRINGSTUFF & PATINDEX功能。

SELECT REC, 
substring(STUFF(NOTES, PATINDEX('%[^0-9]%', NOTES), 1, '') , patindex('[0-9][0-9][0-9][0-9][0-9][0-9]', STUFF(NOTES, PATINDEX('%[^0-9]%', NOTES), 1, '')), 6)AS "6digit", 
substring(STUFF(NOTES, PATINDEX('%[^0-9]%', NOTES), 1, '') , patindex('%[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]%', STUFF(NOTES, PATINDEX('%[^0-9]%', NOTES), 1, '')), 8) AS "8digit" 
FROM yourtable 
+0

什麼是'PATINDEX()'?這看起來像一個MS SQL函數,而不是SAS函數。 – Tom

+0

@Tom他正在使用ProcSQL進行提取,我很確定它包含了'PATINDEX'函數。 – Matt

+0

PROC SQL使用與SAS其餘部分相同的功能。如果使用明確的passthru將查詢推送到數據庫中,則可以使用基礎數據庫的語法。 – Tom