我需要在SAS数据集中创建大量文件。我有SAS数据集中所有文件的名称,例如:
doc_names
1. filename1
2. filename2
.
.
.
因此,我需要访问每个文件名,将其与文件路径连接起来,并告诉SAS抓取该文件并从中生成数据集。
例如,如果我在R中这样做,它看起来像这样:
path = 'path-to-files'
filenames = readLines('file-with-filenames.txt')
for (i in 1:length(filenames)) {
current.file = filenames[i]
full.file = paste0(path, current.file)
data.set = read.csv(full.file)
}
基本上current.file = filenames[i]
部分是我在SAS中无法弄清楚的。我需要能够从数据集的特定条目中创建一个宏变量,以便我可以将它与路径连接起来,然后告诉SAS它是一个文件名。
P.S。,我知道我可以创建一个新的数据集条目,该条目具有文件的完整路径。这一切都很好,但它不是问题的核心。
感谢您的帮助!
答案 0 :(得分:1)
就我个人而言,我发现使用数据步骤为这种类型的一次性编程任务生成代码要容易得多。因此,请从文件中读取文件名,使用文件完整路径的名称以及要将CSV文件导入的数据集名称创建变量。然后,您将获得编写PROC IMPORT语句所需的所有信息。
filename code temp;
data filenames ;
length path $100 filename $100 dsname $32 fullname $200 ;
path = 'path-to-files' ;
infile 'file-with-filenames.txt' truncover;
input filename $100.;
fullname=catx('/',path,filename);
dsname = scan(filename,1,'.');
file code ;
put 'proc import datafile=' fullname :$quote. 'out=' dsname
/ ' dbms=dlm replace ; '
/ ' delimiter=","; '
/ 'run;'
;
run;
%include code / source2 ;
同样实际上我不确定我会信任PROC IMPORT或read.csv()来将一系列文件一致地转换为相同的结构。如果CSV文件都包含相同类型的信息,我只需将它们全部读入一个数据集。因此,如果您的CSV文件都有四个变量,那么此数据步骤将把它们全部读入一个数据集。
data all_data ;
length path $100 filename $100 fullname $200 ;
path = 'path-to-files' ;
infile 'file-with-filenames.txt' truncover;
input filename $100.;
fullname=catx('/',path,filename);
infile csv filevar=fullname dsd truncover end=eof ;
* skip the header line;
if not eof then input ;
do while (not eof);
length var1 var2 8 var3 $20 var4 8 ;
informat var2 date9.;
input var1-var4 ;
output;
end;
run;
答案 1 :(得分:0)
假设您有一个包含代码阅读的宏[例如%readin(file=)
包含proc导入或者你有什么],你有很多选择。最简单的:
proc sql;
select cats('%readin(file=',filename,')')
into :readinlist separated by ' '
from yourdataset;
quit;
如果路径是常量,您可以将其添加到readin
宏(硬编码),或将其作为参数添加到readin
宏,或将其添加到上面的串联中 - 无论如何对你的问题最有意义。