DATA Step, Macro, Functions and more

about INFILE option END=

Accepted Solution Solved
Reply
Valued Guide
Posts: 2,175
Accepted Solution

about INFILE option END=

as documented for the INFINE option END=

END=variable

specifies a variable that SAS sets to 1 when the current input data record is the last in the input file. Until SAS processes the last data record, the END= variable is set to 0. Like automatic variables, this variable is not written to the data set.

Restriction:You cannot use the END= option with 
  • the UNBUFFERED option
  • the DATALINES or DATALINES4 statement

Can you explain why this "Restriction" applies to DATALINES? (or it's earlier form CARDS)

(sure the on-line doc offers a work-around using another option, but I'm intrigued why this Restriction applies.)

peterC


Accepted Solutions
Solution
‎10-18-2011 11:14 AM
Respected Advisor
Posts: 3,777

Re: about INFILE option END=

I always thought it was because CARDS are UNBUFFERED.  If you want in-stream buffered data lines use PARMCARDS;

filename FT15F001 temp;

data test;

   infile FT15F001 end=eof;

   input;

   list;

   put eof=;

   parmcards;

hello peter.

hello kitty

;;;;

   run;

View solution in original post


All Replies
Solution
‎10-18-2011 11:14 AM
Respected Advisor
Posts: 3,777

Re: about INFILE option END=

I always thought it was because CARDS are UNBUFFERED.  If you want in-stream buffered data lines use PARMCARDS;

filename FT15F001 temp;

data test;

   infile FT15F001 end=eof;

   input;

   list;

   put eof=;

   parmcards;

hello peter.

hello kitty

;;;;

   run;

Valued Guide
Posts: 2,175

about INFILE option END=

thank you data_null_;

as you demonstrate, PARMCARDS would work!

I guess in the days of the ? interface, code (and card datalines) were processed line by line and the line I would want to flag in the END= var is the line before the semi-colon - so it is unrecognised until too late!

Seems like a long time since anyone used that ? interfaceSmiley Wink Do you think it is still available? If it is no longer available why preserve the analogy?

Alternatively the END=var could be flagged once that ; is recognised. Would that be a valid approach?

peter

Super User
Posts: 9,685

about INFILE option END=

Null' s code can work, because he used Filename statement.

if you keep cards into a file.

Filename x 'c:\test.txt'.   end= option also can work.

For this case, why not use eof= option to detect the end of cards.

Ksharp

Valued Guide
Posts: 2,175

about INFILE option END=

thank you ksharp

eof=label is the alternative option I referred to in my original question.

In the example above from data_null_; the PARMCARDS seem no more "buffered" than DATALINES, but if that is all it needs to obtain the effect of END= on the INFILE statement for "instream" data then I shall be adopting that route.

(FT15F001 must be assigned for PARMCARDS to be written, but although there is reference to FT15F001 in the config file, that is not enough:smileyconfused: so I expect to add something to the autoexec to eliminate the need for any further FT15F001 filename statements).

I was reminded of the Restriction when testing demo code in the posting from SASJedi at 18-Oct-2011 19:16 (in response to FriedEgg)
"Re: Reading tab-delimited data using a macrohttp://communities.sas.com/thread/31512

        if last then do;

...

           call symputx('mlen_this',mlen_this);

           call symputx('mlen_that',mlen_that);

    end;

the call symputx() are never executed

Although the code is easily adapted to use the eof= option.

it seemed appropriate to

          Question that Restriction

probably pointless question, because it will probably never change

supplemental question

Would it add value to have either a NOTE: or WARNING: for the setting of an option that cannot take effect (such as this one)?

Would it add enough value to justify a suggestion for the SASware ballot?

peter

Respected Advisor
Posts: 3,777

Re: about INFILE option END=

Peter.C wrote:

supplemental question

Would it add value to have either a NOTE: or WARNING: for the setting of an option that cannot take effect (such as this one)?

Would it add enough value to justify a suggestion for the SASware ballot?

peter


Do you mean this warning?

1    data _null_;

2       infile cards end=eof;

WARNING: The value of the INFILE END= option cannot be set for CARDS or DATALINES input.

3       input;

4       list;

5       cards;

Super User
Posts: 9,685

Re: about INFILE option END=

Yes. SASJedi should use filename statement.

supplemental question

Would it add value to have either a NOTE: or WARNING: for the setting of an option that cannot take effect (such as this one)?

Would it add enough value to justify a suggestion for the SASware ballot?

peter

I am not sure. Maybe you can check some system option to suppress these message. Just like keep drop statement.

Ksharp

Respected Advisor
Posts: 3,777

Re: about INFILE option END=

Peter.C wrote:

Seems like a long time since anyone used that ? interface Do you think it is still available? If it is no longer available why preserve the analogy?

UNIX SAS 9.2 started with -NODMS.

  1? data _null_;
   infile cards end=eof;
   input;
   list;
   put eof=;
   cards;
hello kitty
;;;
  2? run;
WARNING: The value of the INFILE END= option cannot be set for CARDS or
         DATALINES input.

  7>
eof=0
RULE:      ----+----1----+----2----+----3----+----4----+----5----+----6----+--
7          hello kitty

  8>
NOTE: DATA statement used (Total process time):
      real time           0.09 seconds
      cpu time            0.02 seconds
     

  9?

Valued Guide
Posts: 2,175

about INFILE option END=

does the parmcards example work just as well?

Respected Advisor
Posts: 3,777

Re: about INFILE option END=

Not exactly the same.  You have to submit PARMCARDS first. While not so intuative is probably how it should be done anyway.

  • create a file
  • read a file

filename FT15F001 clear;

filename FT15F001 temp;

   parmcards;

hello peter.

hello kitty

;;;;

data test;

   infile FT15F001 end=eof;

   input;

   list;

   put eof=;

   run;

Valued Guide
Posts: 2,175

about INFILE option END=

Not exactly the same. You have to submit PARMCARDS first. While not so intuative is probably how it should be done anyway.

  • create a file
  • read a file

thought it might be like thatSmiley Wink

So - I think that (almost always, being able to place parmcards where datalines would go) demonstrates that,

other than in "line interactive" mode, code is buffered as it is submitted to SAS even when it includes "instream data" i.e. CARDS, PARMCARDS and DATALINES .

Well, until the logic of that  changes the treatment of "instream data" to "buffered", I'll try to respect that WARNING and use EOF= rather than END= when testing the end of an INFILE.

At least EOF= allows code to remain otherwise unaltered when development testing (with instream data) progresses to working with "real data" that is not "instream".

code like

     infile cards truncover END= last;

...

   if last then call symputx('mlen_that',mlen_that);

cards;

will become something like

   infile cards truncover EOF= eof_label ;

...

return;

eof_label:

   call symputx('mlen_that',mlen_that);

cards;


I might just stop using END= on INFILE statements, completely:smileyshocked:

peter    

☑ This topic is SOLVED.

Need further help from the community? Please ask a new question.

Discussion stats
  • 10 replies
  • 3783 views
  • 7 likes
  • 3 in conversation