我已经在很多主题中搜索了我的问题,但还没有解决方案。 我的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对变量重新排序的解决方案,但它改变了已导入变量的顺序,而不是在导入步骤中。
只有当数据源按变量顺序变化时,代码才能正常运行,没有问题。
感谢您的帮助。
答案 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导入导入所有变量(顺序无关紧要)。然后我创建一个数据步骤,我只保留我感兴趣的变量,这次是按照正确的顺序。我会告诉你它是否正常。
汤姆的解决方案似乎还不错,我会试一试。
感谢您的帮助。