看板 Statistics 關於我們 聯絡資訊
------------------------------------------------------------------------ [軟體程式類別]: SAS [程式問題]: 資料處理 [軟體熟悉度]: 低(1~3個月) [問題敘述]: 不好意思,由於最近在寫sas的作業,有出現一些資料處理的問題, 需要再麻煩各位大人了 原始的TXT檔長相如下: 公司 年 月 日 概估年月 財務報表公告日 XXXX 甲公司 2010 4 30 200912 20100430 XXXX 甲公司 2010 4 30 201003 20100430 XXXX 甲公司 2010 8 31 201006 20100831 XXXX 甲公司 2010 10 29 201009 20101029 YYYY 乙公司 2010 3 10 201002 YYYY 乙公司 2010 4 9 201003 20100429 YYYY 乙公司 2010 4 29 200912 20100429 YYYY 乙公司 2010 4 29 201003 20100429 因為之前有讀取過類似格式的TXT檔,發現偶有些TXT檔好像導出資料的時候用 TAB做分隔,因此讀取的時候我是另加DELIMITER='09'X的語法,這次也是利用 這樣的方式讀取TXT檔,但是在檔案中財務報表公告日那列原來為空格的儲存 格,讀進SAS後竟然不是遺失值,而是自動讀取公司代碼,因為我原來打算要把 有空格那列的資料刪除,可是這下就沒辦法用「IF 變數=. THEN DELETE」的作法, 後來我試著用「IF 變數=公司代碼 THEN DELETE」,可是我發現,有些空白格讀 入的不一定是同一列的公司代碼,而是下一列不同的公司代碼,因此到這裡小妹 又卡住了,不知道要如何將財務報表公告日那列原來為空格的那筆資料刪除? 另外,想請問一下,像這種以tab為分隔的txt檔,在讀取的時後,有沒有什麼 辦法可以可以將連在一起的概估年月,像是200912分割成2009 12,財務報 表公告日也是一樣,想把連在一起的年月日分割,我原來有試著用欄位輸入法, 可是好像原始檔用tab分隔的檔案,讀取的時候欄位都會跑掉,之所以要分割是 因為要將概估年月是2009年的刪掉,只想留下2010年的部份,雖然看起來原始 檔案中已經分開列示的年月日等變數和財務報表公告日很像,但是因為我還要將 這個檔案和另外一份合併,再以財務報表公告日為主去比對出另外一份檔案中, 和這份檔案財務報表公告日相同的資料,抓取前後20天的資料,所以在一開始 讀取上述的原始txt檔時,希望盡量能將可以比對的年月日分開列示,以方便進 行比對合併資料。 最後,想請問一下,由於原始TXT檔中,同一家公司可能會出現兩次同樣的概估年度 ,如果出現重複的情形,我只想保留第一筆資料,不知道用「NODUPKEY」的語法能不能 處理呢? 不好意思,麻煩各位了,謝謝^^ ----------------------------------------------------------------------------- -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.25.244.73
west1996:1.原始檔有missing的問題可以參考missover和truncover這 06/06 13:10
west1996:兩個option 06/06 13:10
west1996:2.如果要切年月日的話在input這一句的變數指定方法要作 06/06 13:11
west1996:修改,要跟SAS說每一個變數要從txt的第幾欄讀到第幾欄, 06/06 13:11
west1996:語法請參考help的「input」條目下的list 06/06 13:13
west1996:3.在讀取外部檔階段似乎不能去重複? 06/06 13:14
先謝謝大人的回答,可能是我表達的不是很清楚,針對大人第一個回答,在原始 檔中空格的部份,我原來以為讀進sas檔中會是遺失值,這樣我就可以針對遺失 值的部份,利用if語句刪除那列,但是,實際操作後,發現sas讀取的時候,原 始檔中原來是空格的部份,sas會自動帶入下一列的公司簡碼,這樣一來,我就 不知道要如何能刪除原始檔中原來是空格的那列資料,因為原始檔好像是用tab 去做分隔,我不太確定是不是因為這個原因所導致這樣的情形,另外,我也有試 過大人所提的,在input時指定每一個變數要從第幾欄到第幾欄,可是,可能是 因為原始檔不是以空格做分隔,而是以tab做分隔,我在原始檔數的欄位,在 sas 讀取後反而會全部跑掉,因為之前沒碰過這樣的情形,所以想請教各位一下,謝 謝^^ 剛剛試著參考其他文章選取欄位的作法 試著寫了一段程式 DATA d; INFILE anndatee DELIMITER='09'X FIRSTOBS=2; INPUT code name$ yr1 month1 date1 Quarter$ annodate$; DROP yr1 month1 date1; if length(annodate) eq 4 then delete; yr2=substr(Quarter,1,4); month2=substr(Quarter,5,2); run; 可是我發現又出現以下問題: 1.在log視窗內,出現這段note NOTE: 4859 records were read from the infile ANNDATEE. The minimum record length was 26. The maximum record length was 39. SAS went to a new line when INPUT statement reached past the end of a line. The data set WORK.D has 4609 observations and 6 variables. 雖然原始檔有4859筆資料,但是讀進sas檔卻只有4609筆??? 2.原來設定Quarter及annodate變數時並未改成文字型態,但是採用substr的話卻無法 產生我想要抓取的年月,所以後來改成文字型態進行處理,不知道這樣作對不對,因為 如果要和另外一個檔案以年月進行比較的話,勢必要將該檔案的年月改成文字型態,才 能進行比較。 不好意思,因為老師作業提供的原始檔實在很怪,所以一直出現問題,還請各位多多包涵 謝謝^^ ※ 編輯: joyce618 來自: 114.43.116.83 (06/06 23:47)
west1996:先在infile後面加上missover和truncover這兩個關鍵字看看 06/07 00:09
west1996:比數會錯就是因為原始資料裡面有missing的原因,先把筆數 06/07 00:10
west1996:和資料讀對了,再來考慮後面的問題,不然也是白搭XD 06/07 00:10