2016-12-14 32 views
0

有沒有辦法覆蓋遇到的第一個值設置的字符長度的默認行爲,而是將會話的所有字符數據設置爲具有相同的固定長度?SAS:爲會話中的所有字符類型數據設置默認長度


多I日常工作中的數據是一個類似格式/結構,例如.csv或.txt。我發現使用帶有列表輸入的infile語句對於導入這類數據非常有效。

例如,假設我有一個文本文件myData.txt

  myData.txt 
string1 string2 num1 string3 num2 
hello there 12 this 33 
is  some 45 sample 2 
data for  8 you  12 

然後,我會用這樣的代碼來實現它。

%let dataDirectory = C:\path\to\file; 
%let dataFile  = myData.txt; 

filename myFile "&dataDirectory.\&dataFile."; 
data in_data; 
    infile myFile dsd dlm = '09'x firstobs = 2; 

    length 
    string1 $ 50. 
    string2 $ 50. 
    num1  8 
    string3 $ 50. 
    num2  8 
    ; 

    input 
    string1 $ 
    string2 $ 
    num1 
    string3 $ 
    num2 
    ; 
run; 
filename myFile clear; 

我發現它有length語句,使我沒有數據被截斷非常重要。由於數據集不是特別大,因此將所有字符長度設置爲某個固定的數量是有意義的,這將確保不會發生截斷。我發現默認的數字長度就足夠了。

這種方法的問題是,任何時候變量名稱需要改變等,我需要在lengthinput陳述進行更改。這成爲一個麻煩,尤其是當有150個變量時,我希望這是不必要的。

列表輸入似乎適合我的需求。我可以使用列輸入,但是我不得不擺弄定義列寬。在處理150列時,我想不出一種簡單的方法。能夠全局定義所有字符長度,就像數字的默認值8一樣,可以解決我的問題。這可能嗎?或者,也許你有更好的方法來引入如myData.txt這樣的數據?

回答

1

您可以使用宏變量來存儲您的默認長度。然後你可以在一個地方改變它。

您可以在您的INPUT語句中使用變量列表,以便您不必擔心多次輸入變量名稱。

%let dataDirectory = C:\path\to\file; 
%let dataFile  = myData.txt; 
%let defLength = $80 ; 

data in_data; 
    infile "&dataDirectory/&dataFile" dsd dlm='09'x firstobs=2 truncover ; 

    length 
    string1 &defLength 
    string2 &defLength 
    num1  8 
    string3 &defLength 
    num2  8 
    ; 

    input (_all_) (:) ; 
run; 
+0

這太棒了!清楚的是,'(:)'作爲[輸入修改器] [1]還是作爲通配符? [1]:http://support.sas.com/documentation/cdl/en/lestmtsref/69738/HTML/default/n0lrz3gb7m9e4rn137op544ddg0v.htm#p1wk2kecsf6iz8n1ufug4i5pg6id –

+0

它是一種輸入格式修飾符。你需要在第二個()內部有一個信息列表,但你不想列出任何實際的信息,因爲你不知道(\ _all_)列表中的變量是什麼。 – Tom

+1

你也可以使用'+ 0'作爲格式列表,而不是':'。這表示將列位置向前移動零列。所以它只是滿足了在第二組'()'中有一個格式列表的語法結構。 – Tom

0

如果您按照正確的順序保留長度語句,則可以使用INPUT語句的SAS變量列表。輸入語句中不需要$符號。如果您對某些變量有INFORMATS,請使用INFORMAT語句進行關聯。

data in_data; 
    infile myFile dsd dlm = '09'x firstobs = 2; 

    length 
    string1 $ 50. 
    string2 $ 50. 
    num1  8 
    string3 $ 50. 
    num2  8 
    ; 

    input (string1--num2)(:); 
run; 
+0

您可以使用'input string1 - num2;'或者更簡單地使用'_ALL_'構造。像'input(_all _)(:);' – Tom

0

您可以指定SAS應該多少行使用,以確定現場使用PROC進口「guessingrows」選項屬性。這樣proc導入將會照顧你可能擁有的任何數量的新變量。

proc import out=importeddata 
      datafile= "/examplepath/file.txt" 
      dbms=dlm replace; 
     delimiter='09'X; 
     getnames=YES; 
     guessingrows=5000; 
run; 
相關問題