有沒有辦法覆蓋遇到的第一個值設置的字符長度的默認行爲,而是將會話的所有字符數據設置爲具有相同的固定長度?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
語句,使我沒有數據被截斷非常重要。由於數據集不是特別大,因此將所有字符長度設置爲某個固定的數量是有意義的,這將確保不會發生截斷。我發現默認的數字長度就足夠了。
這種方法的問題是,任何時候變量名稱需要改變等,我需要在length
和input
陳述進行更改。這成爲一個麻煩,尤其是當有150個變量時,我希望這是不必要的。
列表輸入似乎適合我的需求。我可以使用列輸入,但是我不得不擺弄定義列寬。在處理150列時,我想不出一種簡單的方法。能夠全局定義所有字符長度,就像數字的默認值8一樣,可以解決我的問題。這可能嗎?或者,也許你有更好的方法來引入如myData.txt
這樣的數據?
這太棒了!清楚的是,'(:)'作爲[輸入修改器] [1]還是作爲通配符? [1]:http://support.sas.com/documentation/cdl/en/lestmtsref/69738/HTML/default/n0lrz3gb7m9e4rn137op544ddg0v.htm#p1wk2kecsf6iz8n1ufug4i5pg6id –
它是一種輸入格式修飾符。你需要在第二個()內部有一個信息列表,但你不想列出任何實際的信息,因爲你不知道(\ _all_)列表中的變量是什麼。 – Tom
你也可以使用'+ 0'作爲格式列表,而不是':'。這表示將列位置向前移動零列。所以它只是滿足了在第二組'()'中有一個格式列表的語法結構。 – Tom