Join Now

Makro do loops og det derimellem

by Contributor SanderEhmsen on ‎03-08-2016 07:16 AM (605 Views)

Hej Community

 

Jeg løber panden mod en mur i noget makro-kode. Sagen er den, at jeg skal databehandle en masse data, som skal spyttes ud i en samletabel til sidst. Jeg kan sagtens databehandle det, men jeg kan ikke gennemskue, hvordan jeg får mit makro do loop til at virke. 

 

Dybest set vil jeg gerne følgende:

Kør loop i=1 til i=2000 by 2;

       Dan ny makro på baggrund af i og i+1, således at de to næste filer importeres

       Databehandl (i flere steps, desværre)

Output fund til samletabel:

 

 

Først definerer jeg nogle stier, som jeg har fundet via kommandopromten i windows (herunder er kun et meget kort udsnit). Og før jeg beder min studentermedhjælper om at køre det slavisk i hånden, vil jeg høre, om det kan gøres smart i SAS. For selvfølgelig kan det det!

 

%let sti=\\S00606P\H_DFS_BMF\Økonomi og Analyse\Analyse\SAEHM\Python images\Ny mappe;

%let 	file1	=	201603071029172.jpeg.csv	;
%let 	file2	=	201603071029203.jpeg.csv	;
%let 	file3	=	201603071036182.jpeg.csv	;
%let 	file4	=	201603071036203.jpeg.csv	;
%let 	file5	=	201603071043192.jpeg.csv	;
%let 	file6	=	201603071043223.jpeg.csv	;
%let 	file7	=	201603071050192.jpeg.csv	;
%let 	file8	=	201603071050223.jpeg.csv	;
%let 	file9	=	201603071057182.jpeg.csv	;

Nu vil jeg gerne bede den om at køre igennem fra 1 og 2 til og med 8 og 9. (altså den skal tage to filer ad gangen):

Min tanke er, at jeg skal køre et makro do loop uden om det hele, hvor jeg først importerer 1 og 2, databehandler dem, lægger dem ud i en tabel. Importerer 3 og 4, databehandler... osv...

 

Før jeg kan lykkes med et makro do loop (som jeg aldrig har lavet før, og som jeg helt enormt gerne vil have hjælp til), skal jeg jo have det til at køre på mikroniveau. Og her fejler jeg. 

Jeg tænker noget i stil med:

 

data test;
i=1 ; *i skal selvfølgelig hentes i det ydre loop, men for at teste, om det kan virke, definerer jeg den her som 1:;
sti=compress(catt('file',put(j,3.)));
call symput('PATH', sti);
k=i+1;
sti2=compress(catt('file',put(k,3.)));
call symput('PATH2', sti2);

*makro1=&sti;
*makro2=&sti2;
run;

data test2;
klaus=&PATH;
klaus2=&PATH2;
run;

Her undrer det mig, at klaus ikke indeholder 'file1' og at klaus2 ikke indeholder file2, men at de ligger ved siden af som nye variable!?

 

Hvis nogen kan hjælpe mig med det, kommer så tillægsspørgsmålet: Kan man kalde klaus som en makro makro. ALtså jeg vil jo gerne kalde makroen file1 og ikke bare benytte den som værdi. Min tanke var at bruge:

 

 


%let makro1=&&PATH;
%let makro2=&&PATH2;

DATA data3;
  INFILE "&sti\&makro1" DELIMITER=';' LRECL=100000;
input f1-f800;
RUN;

DATA data2;
  INFILE "&sti\&makro2" DELIMITER=';' LRECL=100000;
input f1-f800;
RUN;

 

 

Derefter databehandler jeg i nogle steps og ender med at få 1 datalinje ud i følgende step. Den datalinje vil jeg gerne have ud i et datasæt sammen med værdien i 'i'.

 

 

 

Jeg ved,det er et stort spørgsmål. MEn i stedet for at spørge ad to omgange, tillader jeg mig dette.

Hvis nogen bare kan hinte i en af processerne, er det også meget værdsat!

 

Vh. Sander Ehmsen,

Odense Kommune. 

 

 

 

 

 

 

Comments
by SAS Employee GeorgMorsing
‎03-08-2016 08:35 AM - edited ‎03-08-2016 08:37 AM

Hej Sander,

 

I dit data step test i linje 3 benytter du en variabel "j". Den findes ikke og er derfor missing. Er det ikke et "i" der skal stå der?

 

Jeg skriver et i, og så virker dit data step.

 

I dit data step test2 skal du benytte quotes omkring dine makrovariable. Det skal man altid i denne situation. Det har jeg gjort og så virker det som du ønsker.

 

Her er koden.

 

data test;

i=1 ; *i skal selvfølgelig hentes i det ydre loop, men for at teste, om det kan virke, definerer jeg den her som 1:;

sti=compress(catt('file',put(i,3.)));

call symput('PATH', sti);

k=i+1;

sti2=compress(catt('file',put(k,3.)));

call symput('PATH2', sti2);

*makro1=&sti;

*makro2=&sti2;

run;

data test2;

klaus="&PATH";

klaus2="&PATH2";

run;

 

 

Alt hvad du skriver kan løses. Man lærer det på vores 3 dages SAS Macro kursus. Faktisk har vi en case opgave som er meget tæt på det du gerne vil lave.

 

 

by Contributor SanderEhmsen
on ‎03-08-2016 09:20 AM

Hej Georg

 

Tak for dit svar og hjælp!

 

Det er da dejligt, at jeg var kommet næsten i mål :-).

Det med de dobbeltecitationstegn rundt om makroen til sidst, var jeg aldrig selv kommet på at prøve. Så helt i mål var jeg nok aldrig kommet selv. 

 

Men ja, når kalenderen tillader det, giver det helt sikkert god værdi med et kursus. Makroer er smarte.

 

by Contributor SanderEhmsen
‎03-17-2016 09:33 AM - edited ‎03-17-2016 09:36 AM

Hej igen

 

Hvis nogen står i samme udfordring som mig, er løsningen faktisk utrolig simpel - når man lige fanger logikken i SAS-opbygningen.

 

Først defineres alle stierne (det gjorde jeg via kommandopromten i windows og excel til at danne koden).

 

%let sti=\\S00606P\H_DFS_BMF\Økonomi og Analyse\Analyse\SAEHM\Python images\Billeder20160315\csv;

%let 	File1	=	201603141249002.jpeg.csv	;
%let 	File2	=	201603141249033.jpeg.csv	;
%let 	File3	=	201603141256032.jpeg.csv	;
%let 	File4	=	201603141256053.jpeg.csv	;
%let 	File5	=	201603141303072.jpeg.csv	;
%let 	File6	=	201603141303103.jpeg.csv	;
%let 	File7	=	201603141310112.jpeg.csv	;
%let 	File8	=	201603141310143.jpeg.csv	;
%let 	File9	=	201603141317142.jpeg.csv	;
%let 	File10	=	201603141317173.jpeg.csv	;
%let 	File11	=	201603141324172.jpeg.csv	;

 

 

 

%let n=10; *sæt antallet af dine filer fratrukket 1;

%macro importer_behandl;
%do i=1 %to &n %by 2;

data _null_;
makro1=catt('file',&i);
makro2=catt('file',&i+1);
call symput('makro1',makro1);
call symput('makro2',makro2);
run;


DATA data3;
  INFILE "&sti\&&&makro1" DELIMITER=';' LRECL=100000;
input f1-f800;
RUN;

DATA data2;
  INFILE "&sti\&&&makro2" DELIMITER=';' LRECL=100000;
input f1-f800;
RUN;


data output;
set step100;
run;

%end;
%mend test;

%importer_behandl;



 


%macro combine;

data big;
 set
 %do i = 1 %to &n %by 2 ;
 master&i
 %end;
 ;
run;

%mend combine;
%combine;

Sværere var det heller ikke. Det er heldigvis stort set samme logik som i andre sprog. Men makroer er vist bare særligt centrale i SAS, fordi der kun findes to former for data - og en matrice således ikke kan bestå af vektorer. 

 

Tak for hjælpen, Georg. Den fik mig videre!