有没有办法覆盖遇到的第一个值设置的字符长度的默认行为,而是将会话的所有字符数据设置为具有相同的固定长度?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