我在一个文件夹中有许多csv文件。它们都具有相同的结构(3列)。下面的SAS代码将所有这些代码导入到一个数据集中。它包括3列及其文件名。
我的挑战是filename变量包括目录和驱动器号(例如'Z:\ DIRECTORYA \ DIRECTORYB \ file1.csv')。我怎样才能列出文件名而不是路径(例如file1.csv)?谢谢
data WORK.mydata;
%let _EFIERR_ = 0; /* set the ERROR detection macro variable */
length FNAME $80.;
infile 'Z:\DIRECTORYA\DIRECTORYB\*2012*.csv' delimiter = ',' MISSOVER DSD lrecl=32767 filename=fname firstobs=2;
informat A $26. ;
informat B $6. ;
informat C 8. ;
format A $26. ;
format B $6. ;
format C 8. ;
input
A $
B $
C;
if _ERROR_ then call symputx('_EFIERR_',1);
filename=fname;
run;
答案 0 :(得分:0)
我认为,最好的办法是使用正则表达式。添加到您的DATA stel:
reg1=prxparse("/\\(\w+\.csv)/");
if prxmatch(reg1, filename) then
filename=prxposn(reg1,1,filename);
答案 1 :(得分:0)
我们可以尝试将其分为两个data
步骤。我们将在第一个data
步骤中将文件名提取到一个数据集中。在第二个数据步骤中,我们将文件名(包括.txt或.csv)打到它们在组合数据集中的相应观察值。
我们将使用PIPE
方法或PIPE
语句,DIR
命令和/b
。
例如,如果我有三个.txt文件:example.txt,example2.txt和example3.txt
%let path = C:\sasdata;
filename my pipe 'dir "C:\sasdata\*.txt"/b ';
data example;
length filename $256;
infile my length=reclen;
input filename $varying256. reclen;
run;
data mydata;
length filename $100;
set example;
location=cat("&path\",filename);
infile dummy filevar=location length=reclen end=done missover;
do while (not done);
input A B C D;
output;
end;
run;
第一个data
步骤的输出:
filename
example.txt
example2.txt
example3.txt
输出第二个data
步骤:
filename A B C D
example.txt 171 255 61300 79077
example.txt 123 150 10300 13287
example2.txt 250 255 24800 31992
example2.txt 132 207 48200 62178
example2.txt 243 267 25600 33024
example3.txt 171 255 61300 79077
example3.txt 123 150 10300 13287
example3.txt 138 207 47400 61146
在Windows中,这将读取文件夹中的所有.txt文件。它应该适用于.csv文件,只要在第二个delimiter=','
步骤中在infile语句中添加data
,并将filename语句中的扩展名更改为*.csv
。干杯。