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

Stop sas macro from overwriting different imported csv files as the same sas dataset

我找到了一个宏,并一直在使用它来导入以 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'));

或者它在导入语句中可能是 out=&&dsn&i 因为它会快速覆盖以前的 SAS 文件,直到它完成每个文件。只是我需要所有的 sas 文件,而不仅仅是最后一个文件。

我的猜测是你是对的,它与这一行有关:

call symputx(cats('dsn',_n_),compress(scan(filename,-2,'\.'), ,'ka'));

陷阱在传递给 compress 的参数中。压缩可用于删除或保留字符串中的某些字符。在上面的示例中,他们使用它通过传入 'ka' 修饰符来仅保留字母字符。这实际上导致具有不同名称的文件(因为它们具有不同的编号)被视为同一文件。

您可以通过将参数从 ka 更改为 kn 来修改此行为以保留字母字符、数字和下划线字符。

此更改确实意味着您还需要确保 none 个文件名以数字开头(因为 SAS 数据集不能以数字开头)。

压缩函数的文档在这里:

http://support.sas.com/documentation/cdl/en/lrdict/64316/HTML/default/viewer.htm#a000212246.htm

一个简单的调试方法是获取包含所有 call symput 语句的数据集,除了将这些值存储在宏变量中之外,还将它们写入数据集中的变量。同时将其从 data _null_ 更改为 data tmp 语句。然后,您可以查看每个文件的目标 table 名称。