SAS,数据导入中的变量顺序

时间:2016-06-29 12:30:28

标签: variables import sas

我已经在很多主题中搜索了我的问题,但还没有解决方案。 我的SAS代码从.txt文件导入数据,问题是变量的顺序从一个版本变为另一个版本(因此我必须将其更改为适合我的代码,否则它会破坏)。这是导入数据的代码:

data Donnees1                        ;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
infile "&source\Donnees\&data1" delimiter='09'x MISSOVER DSD
lrecl=32767 firstobs=2 ;

informat Numero $100. ;
informat NU_CLI $100. ;
informat Date $100.;
informat Code $10. ;
informat RESEAU $100.
informat TOP_SAN $10. ;
informat TOP_PRV $10. ;

format Numero $100. ;
format NU_CLI $100. ;
format Date $100.;
format Code $10. ;
format RESEAU $100.
format TOP_SAN $10. ;
format TOP_PRV $10. ;

input

Numero
NU_CLI
Date
Code
RESEAU
TOP_SAN
TOP_PRV;

if _ERROR_ then call symput('_EFIERR_',1);  /* set ERROR detection macro variable */
run;`

我正在寻找一个选项,这样,如果变量在源文件中改变顺序,它就不会让我的代码崩溃。 我已经看到了使用retain对变量重新排序的解决方案,但它改变了已导入变量的顺序,而不是在导入步骤中。

只有当数据源按变量顺序变化时,代码才能正常运行,没有问题。

感谢您的帮助。

4 个答案:

答案 0 :(得分:0)

如果变量在文本文件中命名,则可以使用PROC IMPORT GETNAMES选项让SAS自动为变量命名。这并没有为datastep infile提供尽可能详细的控制,但只要您的输入文件不是太不规则就应该有效。

答案 1 :(得分:0)

您还应该在数据步骤中更改input列表中变量的顺序。

答案 2 :(得分:0)

如果变量名称和属性没有改变,那么您可以通过从文件的标题行中读取变量名来动态生成INPUT语句。读取标题行并生成一个宏变量。

data _null_;
  infile "&source\Donnees\&data1" obs=1;
  input;
  call symputx('varnames',translate(_infile_,' ','09'x));
run;

然后将数据行读入数据集并使用INPUT语句中的变量列表。您实际上不想使用PROC IMPORT创建的丑陋代码。不要将$ xx FORMATS和INFORMATS附加到字符变量,因为它们没有添加任何值,如果它们与变量的实际长度不同步,可能会导致问题。

data Donnees1;
  infile "&source\Donnees\&data1" dlm='09'x TRUNCOVER DSD lrecl=32767 firstobs=2 ;
  length
    Numero $100
    NU_CLI $100
    Date $100
    Code $10
    RESEAU $100
    TOP_SAN $10
    TOP_PRV $10
  ;
  input &varnames ;
run;

答案 3 :(得分:0)

我找到了一个解决方案,但还没有测试过:创建一个临时工作表,我通过proc导入导入所有变量(顺序无关紧要)。然后我创建一个数据步骤,我只保留我感兴趣的变量,这次是按照正确的顺序。我会告诉你它是否正常。

汤姆的解决方案似乎还不错,我会试一试。

感谢您的帮助。