是否有办法覆盖由遇到的第一个值设置的字符长度的默认行为,而是将会话的所有字符数据设置为具有相同的固定长度?
我每天使用的大部分数据都具有类似的格式/结构,例如.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
这样的数据?
答案 0 :(得分: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;
答案 1 :(得分:0)
如果以正确的顺序保留长度语句,则可以使用SAS变量列表作为INPUT语句。您不需要输入语句中的$符号。如果某个变量有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;
答案 2 :(得分:0)
您可以使用proc import指定SAS应使用“guessingrows”选项确定字段属性的行数。这样,proc import会处理你可能拥有的任何数量的新变量。
proc import out=importeddata
datafile= "/examplepath/file.txt"
dbms=dlm replace;
delimiter='09'X;
getnames=YES;
guessingrows=5000;
run;