2016-12-14 238 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; 
相关问题