2012-11-30 43 views
2

我有類似的東西,它是.txt格式。從文本中提取日期和時間使用SAS

'隨機標題'

隨意的事情,00:00 AM,1月1日

2005年,555個字,(英文)

'隨機的長標題'

隨機東西,00:00 AM,2005年1月1日,111字,

(英文)

時間和日期需要以yyyymmdd和hhmm格式提取。 我試圖用逗號作爲分隔符。

DATA News; 
    INFILE 'C:xxxx/xxxx/xxxx' DLM','; 
    INPUT Title $75. Time $10. Date $20. Words $15. Lang $10.; 
PROC PRINT DATA=News; 
    TITLE 'Time and Date'; 
    VAR Time Date; 
RUN; 

但它失敗了,那些條目包含多行,也沒有格式良好。

有沒有解決方法?

+0

你有什麼嘗試? http://mattgemmell.com/2008/12/08/what-have-you-tried/ – durron597

+0

如果你爲你想要做的事提供更多的上下文,這將有所幫助。這聽起來像你需要從非結構化文本中提取日期和時間。 SAS可能不是最好的工具。您的解決方案是否必須完全採用SAS?或者,如果SAS是最終產品,這是否足夠?您可以查看SAS輸入和掃描。 –

+0

你的問題並不十分清楚。請顯示您嘗試過的內容以及您期望的輸出內容。 – BellevueBob

回答

1

如果你的日期總是格式化,像這樣: 00:00 AM,2005年

1月1日之後,你可以使用一個Perl的正則表達式找到他們。

data test; 
input @; 
_prx = prxparse('/\d\d:\d\d (?:AM|PM), \d{1,2} (?:January|February|March) \d{4}/'); 
start = 1; 
stop = length(_infile_); 
call prxnext(_prx, start, stop, _infile_, position, length); 
    do while (position > 0); 
     found = substr(_infile_, position, length); 
     put found= position= length=; 
     call prxnext(_prx, start, stop, _infile_, position, length); 
    end; 
datalines; 
'random title' 
random things , 00:00 AM, 1 January 
2005, 555 words, (English) 
'random long title' 
random things , 00:00 AM, 1 January 2005, 111 words, 
(English) 
;;;; 
run; 

然後像使用SAS字符變量一樣使用FOUND值來獲取日期和時間或日期時間信息。顯然延長我的月份清單,以包含所有十二個月。

找到第二個例子,但不是第一個例子(在示例中使用datalines可以合理找到);但如果您不使用數據庫,而是使用文本文件,則可以操作記錄格式以刪除換行符和回車符,從而將兩者視爲單個記錄(並因此匹配)。查看RECFM=N瞭解更多詳情。

+0

非常感謝,但由於某些原因,它不起作用 –

+0

@FredNg你會編輯你的問題,並解釋當你嘗試喬的代碼的結果嗎? –