Help using Base SAS procedures

Creating files based on Filename

Reply
Frequent Contributor
Posts: 122

Creating files based on Filename

Hi,

I have a requirement based on store branches I have to create .csv files on to a drive.

I used Filename FTP to create .csv files on the drive,but the problem is certain branches does have empty files,in that case i do not want to create output files on the drive for that branch.

How can I achieve this?Please share your thoughts.

Respected Advisor
Posts: 3,890

Re: Creating files based on Filename

You could test if there is data before you execute the filename FTP. May be you should post your code so we can suggest some changes to it.

Super User
Posts: 9,681

Re: Creating files based on Filename

Yes. I can firstly check whether there are some obs in a dataset by using DICTIONARY.TABLES.

Ksharp

Frequent Contributor
Posts: 122

Re: Creating files based on Filename

Below is the code I am using:

%MACRO MCASPLT(MCA1,FNME1,F1);

DATA _NULL_;

  SET DATAOT1.NBARI;

  %LET TEXT_FLG=N;

  IF MCA = "&MCA1" THEN DO;

   %LET TEXT_FLG=Y;

   %PUT &TEXT_FLG;

   FILE &FNME1  DSD DLM=',';

   PUT MCA MRN1 ADMDT DISDT

       ;

  END;

%IF &TEXT_FLG  =  Y  %THEN %DO;

    %LET OUT_LRECL=8000;

    %LET CD=ISM\LG\NCAL\TEST;

    %LET HLQO=HPS2.Y3012.XAAA.&F1..TXTOUT;

    %LET OUT_NAME=XAAA.&F1;

    FILENAME NCHS01 "&HLQO" DISP=SHR;

       FILENAME NCHS FTP

                "&OUT_NAME"

                &HOST_PORT_USER_PASS

                CD = "&CD"

                LRECL = &OUT_LRECL

                ;

       RUN;

       DATA _NULL_;

         INFILE NCHS01 SHAREBUFFERS;

         FILE NCHS;

         INPUT;

         PUT _INFILE_;

        RUN;

   % END;

RUN;

%MEND;

%MCASPLT(ANTCH,DATAO02,ANTI);

%MCASPLT(FOLM,DATAO03,FOLS);

ENDSAS;

In the MCA value FOLM is not in my input file,but the ftp statement is creating an empty file in my ftp location.I dont want FTP an empty file.Please help.

Super User
Posts: 5,082

Re: Creating files based on Filename

I don't know if this will solve everything, but it might.

The most obvious flaw in your program is trying to use a DATA step IF/THEN to control whether or not %LET executes.  %LET always executes.  If you examine your log, you will see that %PUT &TEXT_FLG; always writes Y.  To change that, change the second %LET statement to read:

CALL SYMPUT('TEXT_FLG', 'Y');

Move the final RUN statement earlier, just before testing for %IF &TEXT_FLG=Y.  That forces the DATA step to run before you check the value of &TEXT_FLG.  FILENAME statements are not part of a DATA step, anyway.

Also, move the %PUT statement to the very end of the macro.  If you leave it in its current location, it will write the value of &TEXT_FLG BEFORE the DATA step executes.

Good luck.

Super User
Super User
Posts: 6,500

Re: Creating files based on Filename

First reverse the order of your INPUT and your FILE statements in the DATA step and see if it helps.  Perhaps if SAS stops on an empty input file before getting to the FILE statement it might not send anything to FTP.

Can you get the FTP to work using FTP engine in the FILE statement in the DATA _NULL_ instead using the FILENAME statement.

That might make it more likely to skip writing the file.

Do you really want the SHAREBUFFERS options on your INFILE statement as you are writing to a different output file?  Not sure this makes any difference for this problem.

Super User
Posts: 9,681

Re: Creating files based on Filename

It looks like you are querying some obs rely on a condition . Here is an example . You need to vary it to suit your taste.

%MACRO MCASPLT(sex,FNME1,F1);
proc sql;
create table temp as
 select * from sashelp.class 
  where sex="&sex" ;
quit;


%if &sqlobs ne 0 %then %do;
 proc print ;run;%end;

%MEND;

%mcasplt(F,FNME1,F1)

Ksharp

Ask a Question
Discussion stats
  • 6 replies
  • 238 views
  • 0 likes
  • 5 in conversation