SAS:为会话中的所有字符类型数据设置默认长度

时间:2016-12-14 18:08:16

标签: input sas character

是否有办法覆盖由遇到的第一个值设置的字符长度的默认行为,而是将会话的所有字符数据设置为具有相同的固定长度?

我每天使用的大部分数据都具有类似的格式/结构,例如.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这样的数据?

3 个答案:

答案 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;