Is that possible to read one by one observation from a data set through Do Loop?
My requirement is to traverse through the observations of the data set using loops.
Thank you:)
Not tested code;
data _null_;
do until(last);
set sashelp.class end=last;
n+1;
end;
put n=;
run;
Ksharp
Hi,
i'm not sure if this is what you're looking for.
%macro loop;
proc sql noprint;
select count(*) into :observations
from sashelp.class;
quit;
%do i=1 %to &observations;
data _null_;
set sashelp.class (firstobs=&i obs=&i);
putlog "Loop: &i do something";
run;
%end;
%mend;
%loop;
%macro fun;
%do i=1 %to 2;
data _null_;
set lib.EMPLOYEE (firstobs=&i obs=&i);
putlog " I want to print EMP_ID and EMP_NAME value for observation 1 and 2";
run;
%end;
%mend fun;
%fun;
This is good example ....But how do I print that observation ? For eg. if dataset EMPLOYEE have EMP_ID and EMP_NAME columns then for that observation I want to print EMP_ID and EMP_NAME
I don't understand. SAS reads and processes the observations sequentially in a datastep, so there is no need for a do loop.
Am I missing something here?
Sometimes you need to complete your homework per the instructions...:)
Sometimes you need to open a dataset and iterate through the observations performing other functions on each row. I don't think you can do this within a data step. You can simulate a cursor within a macro statement:
%Macro M1(dataset);
%local dsid rc now;
%let dsid = %sysfunc(open(dataset));
%do %while (%sysfunc(fetch(&dsid)) = 0); /* outer loop across rows;*/
%end; /*while fetch loop*/
%mend;
You can use getvarn or getvarc to retrieve values the current row of &dsid but you have to wrap them in %sysfunc().
I think you might be right about the homework to be honest.
I use OPEN And CLOSE frequently when I want to identify the number of OBS in a dataset, but I have never used FETCH. I can see the benefits to create a Macro variable, but can you use these to write back to a dataset?
Macro functions cannot create or write to a SAS data set. Veryify this by looking in the language documentation at the options available for the open() function
Hi Peter,
OPEN, CLOSE, and FETCH are not solely MACRO functions. They can also be used within a datastep,as per below:
DATA MYDATA;
/* CREATE VARIABLES FOR ASSIGNMENT */
/*BY CALL SET */
LENGTH NAME $8 SEX $1 AGE WEIGHT HEIGHT 8;
DROP RC DSID;
DSID=OPEN("SASHELP.CLASS","I");
CALL SET (DSID);
DO I=1 TO 10;
RC=FETCHOBS(DSID,I);
OUTPUT;
END;
RUN;
Scott
Of course you are correct.
What I should have pointed out is that OPEN() in the context requested provides only the functionality of the the data step environment through %SYSFUNC() and although the SAS/SCL environment provides a similar function which does support UPDATE and (iirc) NEW these open modes were not ported to the base SAS environment along with several other SCL-type functions (way back in SAS release 6.09e days).
Which is a long winded way of saying
Answer your own question
Read the documentation for OPEN() - there is no WRITE
Should the WRITE mode be needed, learn and use SAS/SCL
.
Thanks Peter. It is nice to hear about the history of these functions. I only started with V8 and although I feel as though I have a decent grip on things, I certainly have a few of those "why is it so" moments.
Thanks again for clearing that up.
Hi Scott,
As an example as to why this can be useful from personal experience. I've had to do a levenstein (complev) between all words of a "dictionary" and all words in a given column of a gigantic dataset. Building a proc FCMP taking a character array _TEMPORARY_ as a parameter (the dictionary) allowed me to do so in a single data step with very effective processing speed. In order to pass the said dictionary to the proc FCMP, I needed to do such a do loop on the dictionary dataset to load it in an array.
Vincent
Intriguing Vincent. I look forward to having an opportunity to do that in the future.
Registration is now open for SAS Innovate 2025 , our biggest and most exciting global event of the year! Join us in Orlando, FL, May 6-9.
Sign up by Dec. 31 to get the 2024 rate of just $495.
Register now!
Learn how use the CAT functions in SAS to join values from multiple variables into a single value.
Find more tutorials on the SAS Users YouTube channel.
Ready to level-up your skills? Choose your own adventure.