停止sas宏将不同的导入的csv文件覆盖为相同的sas数据集

时间:2015-07-02 13:25:58

标签: sas sas-macro

我找到了一个宏,并一直用它来导入以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文件而不仅仅是最后一个。

1 个答案:

答案 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语句。然后,您可以查看每个文件的目标表名称。