我找到了一个宏,并一直用它来导入以csv格式提供给我的数据集。现在我需要编辑它,因为我有数据集,其中包含一个id号,我希望sas数据集具有相同的名称。
csvs被命名为IDSTUDY233_first.csv所以我希望sas数据集为IDSTUDY233_first。它应该出现在我的工作文件夹中。
我认为它只会为名为IDSTUDY233_first的每个csv创建一个sas数据集或类似的东西。 (等等每个额外的研究)等等。然而,它以这种方式命名。 IDSTUDY_FIRST 以及每个ID的权利本身。我是宏的新手,并一直试图找出它为什么这样做以及如何解决它。建议?
%let subdir=Y:\filepath\; *MACRO VARIABLE FOR FILEPATH;
filename dir "&subdir.*.csv "; *give the file the name from the path that your at whatever the csv is named;
data new; *create the dataset new it has all those filepath names csv names;
length filename fname $ 200;
infile dir eof=last filename=fname;
input ;
last: filename=fname;
run;
proc sort data=new nodupkey; *sort but don't keep duplicate files;
by filename;
run;
data null; *create the dataset null;
set new;
call symputx(cats('filename',_n_),filename); *call the file name for this observation n;
call symputx(cats('dsn',_n_),compress(scan(filename,-2,'\.'), ,'ka')); *call the dataset for this file compress then read the file;
call symputx('nobs',_n_); *call for the number of observations;
run;
%put &nobs.; *but each observation in;
%macro import; *start the macro import;
%do i=1 %to &nobs; *Do for each fie to number of observations;
proc import datafile="&&filename&i" out=&&dsn&i dbms=csv replace;
getnames=yes;
run;
%end;
%mend import;
%import
*调用导入宏;
正如你所看到的,我添加了对我理解的评论。就像我说的宏对我来说是新的。我的理解可能不正确。我猜这个问题要么在
call symputx(cats('dsn',_n_),compress(scan(filename,-2,'\.'), ,'ka'));
或者它在import语句中可能out =&& dsn& i,因为它快速覆盖以前的SAS文件,直到它执行每一个。我只需要所有sas文件而不仅仅是最后一个。
答案 0 :(得分:1)
我的猜测是你是对的,这与这一行有关:
call symputx(cats('dsn',_n_),compress(scan(filename,-2,'\.'), ,'ka'));
getcha是在传递给compress的参数中。压缩可用于删除或保留字符串中的某些字符。在上面的示例中,他们使用它来通过传递'ka'
修饰符来保留字母字符。这有效地导致具有不同名称的文件(因为它们具有不同的数字)被视为同一文件。
您可以通过将参数从ka
更改为kn
来修改此行为,以保留字母字符,数字和下划线字符。
此更改确实意味着您还需要确保没有任何文件名以数字开头(因为SAS数据集不能以数字开头)。
压缩功能的文档在这里:
http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212246.htm
调试此方法的一种简单方法是将数据集与所有call symput
语句一起使用,除了将这些值存储在宏变量中之外,还要将它们写入数据集中的变量。同时将其从data _null_
更改为data tmp
语句。然后,您可以查看每个文件的目标表名称。