0%

File and Directory Manipulation - SAS&R

In this article, we are going to present how to work with files and folders in R and SAS.

First of all, here sharing a good resource about SAS Marcos is related to our topic. That lists a series of useful macros, and the code is very standard and worthy to learn, highly recommended.

http://sasunit.sourceforge.net/v15/doc/files.html.

For R, I'm willing to recommend the fs R package, which provides a cross-platform, uniform interface file system operations

And then let's begin with our topics.

List of files

Suppose if you want to identify the list of files in a particular directory, in R you can easily choose list.files(). For example list files in a specific directory like the current directory.

list.files(path = "./")

You can also get the files within the subfolders, and just match the .txt files, simple use

list.files(path = "./", pattern = ".txt", recursive = T)

In SAS, limited to my knowledge, just list two approaches. The first approach is to use a filename statement with a pipe device type and dir command in the Windows environment.

filename dirlist pipe 'dir /b E:\Tp\*.txt';

data list;
    length line $200;
    infile dirlist;
    input;
    line = strip(_infile_);
run;

filename dirlist clear;

proc print data=list; run;

The second approach is to use the functions dopen and dread with the help from dnum, as the following example.

filename root "E:\Tp";

data list;
    * --  return variables  --;
    length name $ 512;

    * --  directory to inventory  --;
    dirid = dopen('root');

    if dirid <= 0 then
        putlog 'ERR' 'OR: Unable to open directory.';
    nfiles = dnum(dirid);

    do i = 1 to dnum(dirid);

        * --  directory item name  --;
        name = dread(dirid, i);
        output;
    end;

    rc = dclose(dirid);
    dirid = 0;
run;

The more details for the second approach can be found in these links.

File Exists

Suppose if you want to identify a file called README.md that exists in the current directory, then you can choose the file.exists() function in R, that returns TRUE if the file exists, and FALSE otherwise.

file.exists("./README.md")

In SAS, fileexist function verifies the existence of the file, and it will return 1 if the file exists, and 0 otherwise.

%let fpath=E:\Tp\test.sas;

%macro fileexists(filepath);
    %if %sysfunc(fileexist(&filepath)) %then
        %put NOTE: The external file &filepath exists.;
    %else  %put ERROR: The external file &filepath does not exist.;
%mend fileexists;

%fileexists(&fpath);

Besides if you want to check if a dataset exists, you can choose the exist function. If for checking a variable exists, varnum is recommended.

File Creates

If you want to create a blank file in R then

file.create("./text.txt")

In SAS, I'm not sure if the below is the normal way, but it’s definitely simple anyway.

data _null_;
    file "E:\Tp\test.txt";
run;

File Deletes

If you want to delete a specific file in R, then

file.remove("./test.txt")

In SAS, I think we can simply use fdelete function.

filename defile '"E:\Tp\test.txt';
data _null_;
    rc=fdelete('defile');
run;

Directory creates

Creating a directory is very similar to a file. The function in R is dir.create() that is very convenient to use. In SAS it can be accomplished using the dlcreatedir option and libname statement with 2 lines of code.

options dlcreatedir;
libname folder 'E:\Tp\dummy';

If you want to create or copy multiple folders or directories, more detailed information can be found in Using SAS® to Create Directories and Duplicate Files.

List specific extension files

You can use the macro as shown below to list all the RTF files which means the extension is .rtf.

/*Example*/
/*%ListFilesSpecifyExtension(dir=C:\Users\demo,ext=rtf,out=rst);*/

/*Parameter Description*/
/*dir         input directory*/
/*ext         file name extension*/
/*out         output dataset*/

%macro ListFilesSpecifyExtension(dir=, ext=, out=);
    %local filrf rc did name i;
    %let rc=%sysfunc(filename(filrf,&dir));
    %let did=%sysfunc(dopen(&filrf));

    /* Use the %IF statement to make sure the directory can be opened. If not, end the macro. */
    %if &did eq 0 %then %do;
        %put Directory &dir cannot be open or does not exist;

        %return;
    %end;

    data &out;
        length FileName $200;

        %do i = 1 %to %sysfunc(dnum(&did));
            %let name=%qsysfunc(dread(&did,&i));

            %if %qupcase(%qscan(&name,-1,.)) = %upcase(&ext) %then %do;
                Filename = "&name";
                output;
            %end;
        %end;
    run;

    %let rc=%sysfunc(dclose(&did));
    %let rc=%sysfunc(filename(filrf));
%mend ListFilesSpecifyExtension;

Reference

Directory Listings in SAS
Obtaining A List of Files In A Directory Using SAS® Functions
http://sasunit.sourceforge.net/v15/doc/files.html
Check if a Specified Object Exists
Using SAS® to Create Directories and Duplicate Files