Csv SAS从文件名设置变量

Csv SAS从文件名设置变量,csv,sas,filenames,file-io,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 */ leng

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

我认为,最好的办法是使用正则表达式。添加到您的数据stel中:

reg1=prxparse("/\\(\w+\.csv)/");
if prxmatch(reg1, filename) then
                          filename=prxposn(reg1,1,filename);

我们可以尝试将其分为两个
数据
步骤。我们将在第一步
data
中将文件名提取到一个数据集中。在第二个数据步骤中,我们将把文件名(包括.txt或.csv)添加到组合数据集中各自的观察值上

我们将使用
PIPE
ing方法或
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;
第一个
数据的输出
步骤:

                                     filename

                                   example.txt
                                   example2.txt
                                   example3.txt
                     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
第二个
数据的输出
步骤:

                                     filename

                                   example.txt
                                   example2.txt
                                   example3.txt
                     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文件,只要您在第二个
数据
步骤的infle语句中添加
分隔符=','
,并将filename语句中的扩展名更改为
*.csv
。干杯

这工作完美,我喜欢它是多么简单。非常感谢。