SAS从文件名设置变量

时间:2013-12-28 07:50:20

标签: csv sas filenames file-io

我在一个文件夹中有许多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;

2 个答案:

答案 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。干杯。