Extraer las rutas de la opción SASAUTOS

Este código también está disponible en: Deutsch English Español Français
Nivel de dificultad
Principiante
Publicado el :
Este script define y ejecuta una macro llamada `%getautos`. Esta macro lee el valor de la opción del sistema `SASAUTOS`, que contiene una lista de rutas donde SAS© busca las macros. El código analiza esta cadena de caracteres para extraer cada ruta individual. Maneja varios casos, como rutas entre comillas, sustitución de variables de entorno (precedidas por `!`) y la expansión de la tilde (`~`) para directorios personales en Unix/Linux. La macro genera una tabla de salida (`work.paths` por defecto) que contiene la lista de rutas extraídas. El script finaliza ejecutando la macro y mostrando el resultado, así como imprimiendo el valor bruto de `SASAUTOS` y `SASROOT`.
Análisis de datos

Type : CREATION_INTERNE


El script no lee datos externos. Genera una tabla de datos llamada 'paths' en la librería WORK. El contenido de esta tabla se deriva del valor de la opción del sistema SAS 'SASAUTOS'.

1 Bloque de código
DATA STEP Data
Explicación :
Este bloque define la macro `%getautos`. Utiliza un paso DATA para procesar la cadena de caracteres obtenida a través de `GETOPTION('sasautos')`. La lógica recorre la cadena, extrae cada ruta utilizando la función `SCAN`, gestiona las comillas y realiza sustituciones para las variables de entorno (mediante `SYSGET`) y la tilde (`~`). La función `PATHNAME` se utiliza para resolver los filerefs. Cada ruta válida se añade a la tabla de salida especificada por el parámetro `out`.
¡Copiado!
1%macro getautos(out=paths);
2 DATA &out ( keep = path ) ;
3 LENGTH q $ 32000 temp $ 300 var path $ 255 ;
4 q = getoption ( "sasautos" ) ;
5 
6 *-- remove surrounding (), and internal quotes;
7 IF index ( q , "(" ) THEN
8 q = left(translate ( q , " " , "()'\"" )) ;
9 
10 DO while ( 1 ) ;
11 
12 temp = scan ( q || "***" , 1 , "() " ) ;
13 
14 IF temp = "***" THEN leave ;
15 
16 q = left(substr ( q , LENGTH ( temp ) + 1)) ;
17 
18 IF temp =: "!" THEN
19 DO ;
20 var = scan ( temp , 1 , "!/\ " ) ;
21 temp = tranwrd ( temp , '!' || trim(var)
22 , sysget(trim(var)) ) ;
23 END ;
24 
25 *-- do tilda expansion. Works for ~/ and ~user/ where user is
26 the current user;
27 IF temp =: "~" & symget('sysscp') ^= 'WIN' THEN
28 DO ;
29 var = scan ( temp , 1 , "~/\" ) ; put var=;
30 home = sysget('HOME'); put home=;
31 if var = ' '
32 then temp = tranwrd( temp, '~', sysget('HOME'));
33 else do;
34 userid = sysget('USER'); put userid=;
35 temp = tranwrd( temp, '~' || trim(userid), sysget('HOME'));
36 end;
37 end ;
38 
39 *-- Check for a fileref;
40 path = pathname ( temp ) ;
41 if path = " " then path = temp ;
42 
43 if index ( path , "(" ) then
44 do ;
45 q = trim(left(translate(path, " ", "()'\"""))) || " " || trim ( q ) ;
46 end ;
47 else
48 if path ^= "***" THEN
49 OUTPUT ;
50 END ;
51 RUN ;
52%mend;
2 Bloque de código
PROC PRINT
Explicación :
Este bloque ejecuta la macro `%getautos` con sus parámetros predeterminados, lo que crea la tabla `work.paths`. Luego, se utiliza `PROC PRINT` para mostrar el contenido de esta tabla resultante en la ventana de salida.
¡Copiado!
1%getautos();
2PROC PRINT DATA = paths ; RUN ;
3 Bloque de código
DATA STEP
Explicación :
Este paso `_NULL_` no tiene como objetivo crear una tabla SAS. Utiliza una instrucción `FILE PRINT` para escribir información en la salida estándar (o en el log). Recupera y muestra el valor de la variable de entorno `SASROOT` a través de `SYSGET`, y luego el valor bruto de la opción `SASAUTOS`. Luego realiza algunas manipulaciones de cadenas (`COMPBL`, `COMPRESS`) sobre el valor de `SASAUTOS` y muestra los resultados.
¡Copiado!
1DATA _null_;
2 file PRINT;
3 LENGTH sasautos $32000 sasroot $200;
4 sasroot = sysget('SASROOT');
5 put 'SASROOT:' sasroot=;
6 sasautos = getoption('sasautos');
7 put sasautos=;
8 sasautos = compbl(sasautos);
9 put sasautos=;
10 sasautos = compress(sasautos, '("'')');
11 put 'SASAUTOS:' sasautos=;
12 RUN;
Este material se proporciona "tal cual" por We Are Cas. No hay garantías, expresas o implícitas, en cuanto a la comerciabilidad o idoneidad para un propósito particular con respecto a los materiales o el código contenidos en este documento. We Are Cas no es responsable de los errores en este material tal como existe ahora o existirá, ni We Are Cas proporciona soporte técnico para el mismo.

Documentación relacionada

Aucune documentation spécifique pour cette catégorie.