2016-12-02 96 views
1

是否有可能使用INFILE語句有條件地分配在值一讀或數據集中的另一列被創建,這取決於價值是什麼?條件INFILE語句

data test; 
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2; 
informat var_one 2.; 
informat var_two $4.; 
format var_one 2.; 
format var_two $4.; 
input 
if length(item in question) = 2 then 
var_one 
else 
var_two $; 
run; 

在上述「在問題項」的代碼是我填充我的知識缺口和基本上意味着分配正被讀取中的值到一個或取決於它的長度的其他列。

很明顯,你可以看到我沒有完整的正確的語法在這裏,但可能有人建議我什麼,我需要改變,如果這甚至有可能?

感謝

+0

請發佈測試數據...也許鑽井使用DATALINES而不是INFILE的例子嗎? – Snorex

回答

3

最簡單的方法是將其輸入至一個臨時變量,然後選擇基於這一點。

data test; 
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2; 
informat var_one 2.; 
informat var_two $4.; 
format var_one 2.; 
format var_two $4.; 
input temp $; 
if length(temp) = 2 then var_one=input(temp,2.); 
else var_two = temp; 
run; 

你當然也可以在輸入時做到這一點。

data test; 
infile '&filename' delimiter = ',' missover dsd lrecl 32767 firstobs = 2; 
informat var_one 2.; 
informat var_two $4.; 
format var_one 2.; 
format var_two $4.; 
input @; *start inputtingl 
if length(scan(_infile_,1,',')) = 2 then 
    input var_one; 
else 
    input var_two $; 
run; 

但我覺得第一種方法有點簡單,因爲你不必掃描它。

+0

下面是對@符號re:條件輸入的一些討論。 http://support.sas.com/kb/45/289.html – Snorex

1

你的問題其實並不像一些需要有條件地運行INFILE聲明。這通常會涉及更改要讀取的文件或可能更改要使用的分隔符。

你當然可以有條件地運行INPUT聲明。這通常在輸入流具有許多不同的記錄類型時完成。您記錄的讀取足以確定類型,同時保持符合尾隨@。然後根據記錄類型讀取不同的變量。

input rectype $ @ ; 
if rectype='1' then input @1 rectype name age gender; 
else input @1 rectype company_name job_title ; 

但是,您的問題看起來更像是您有條件地執行賦值語句時所處理的內容。首先將其讀入字符串並測試其長度。基於此,您可以決定將其存儲到哪個變量中。

length temp $10 var_one 8 var_two $4 ; 
input temp ; 
if length(temp)<=2 then var_one = input(temp,2.); 
else if length(temp) < 4 then var_two=temp; 
else put 'WARING: Length too long.' temp= $quote. ; 

或者剛讀入字符串變量,並將其轉換爲數字。您可以通過使用???修飾抑制轉換錯誤,使SAS將數值變量默默地設置爲缺少當字符串看起來不像一個數字。

length var_one 8 var_two $4 ; 
input var_two ; 
var_one = input(var_two, ??2.); 

你可以,如果沒有價值,甚至看空出的字符串如一個數字。

if not missing(var_one) then call missing(var_two);