2
votes

I have a SAS procedures that runs every morning and it takes in a raw data file for the day called "Filename_20141117.txt". The last part of the file name is changing everyday to the date for that day.

I want to make the INFILE statement in my SAS script smarter so that it knows to get the current day's file. I was trying to do a date concatenation, something like this:

infile cat('G:\Finance\RawData\Filename_',year(today()),month(today()),day(today()),'.txt')

Also, is there a way to declare variables and work with them in SAS, and not have them created as a table in your output? I'm a C/C#/VB programmer learning to program in SAS. I was thinking that i could make 3 string variables - day, month, and year. Populate each variable with the corresponding value using the Day(), Month() and Year() function, with Today() as the date input. Then i was going to take these 3 variables and concatenate them to get my '20141118' that would be located at the end of the .txt file.

However it doesn't like me doing this. If anyone knows how to do this that would be fantastic. I'm very new to SAS Programming and its concepts.

Thanks in advance.

1
Not enough credit for good questions on this site in general, but this is good, shows you've had an attempt at something and shows some prior research before asking for help. Cheers!mjsqu

1 Answers

3
votes

The most basic version of your statement would be:

INFILE "G:\Finance\RawData\Filename_%sysfunc(today(),yymmddn8.).txt";

To explain fully:

  • %sysfunc is a macro function in SAS which allows you to use data-step functions in open code, it takes one (optionally two) arguments:
    1. The first argument of %sysfunc is the data-step function in question, in this case we want the value of TODAY(), so that is used.
    2. The second argument (optional) provides the SAS format in which the result should be returned. The SAS format of choice for the date representation you need is yymmddn8. (literally year_year_month_month_day_day, the n represents 'no-separators', and 8 is the length). (e.g. 20141118)

If we were to omit the second argument, we'd get the number of days since 01JAN1960.

If I were to run the statement today it would look like this:

INFILE "G:\Finance\RawData\Filename_20141118.txt";

Also, use of double-quotes here is required because we are using a macro function. If we used single quotes, it would look for a file with the unresolved value of the string above and would most likely fail.

To check what it would resolve to, simply add %PUT to the front of the line, and then just run that line in isolation. The log will show what is returned.