LA GESTIONE DELLE DATE E DEI TEMPI - dssm.unipa.itdssm.unipa.it/chiodi/oldsite/sas/Sassl2.pdf ·...

30
LA GESTIONE DELLE DATE E DEI TEMPI La data è una stringa che viene utilizzata per calcoli e, quindi, deve avere una rappresentazione interna di un numero. Le regole convenzionale per la lettura delle date e tempi sono: DATA = numero giorni dal 1/1/1960 TEMPO = numero secondi dalla mezzanotte ( max 86400 ) DATA-TEMPO = numero secondi dalla mezzanotte del 1/1/1960 i formati delle date accettati in INPUT TRASFORMANO LE STRINGHE IN VARIABILI NUMERICHE Formato Legge DDMMYYc. giorno mese anno MMDDYYc. mese giorno anno YYMMDDc. anno mese giorno YYMMDDc. Accetta anche anni espressi con 4 cifre DATA ESDATE; INPUT GIORNO DDMMYY8.; CARDS ; 010186 01 1 86 1 1 86 01/01/86 01-01-86 01 01 86 RUN;

Transcript of LA GESTIONE DELLE DATE E DEI TEMPI - dssm.unipa.itdssm.unipa.it/chiodi/oldsite/sas/Sassl2.pdf ·...

LA GESTIONE DELLE DATE E DEI TEMPI La data è una stringa che viene utilizzata per calcoli e, quindi, deve avere una rappresentazione interna di un numero. Le regole convenzionale per la lettura delle date e tempi sono:

DATA = numero giorni dal 1/1/1960

TEMPO = numero secondi dalla mezzanotte ( max 86400 )

DATA-TEMPO = numero secondi dalla mezzanotte del 1/1/1960

i formati delle date accettati in INPUT

TRASFORMANO LE STRINGHE IN VARIABILI NUMERICHE

Formato Legge

DDMMYYc. giorno mese anno

MMDDYYc. mese giorno anno

YYMMDDc. anno mese giorno

YYMMDDc. Accetta anche anni espressi con 4 cifre

DATA ESDATE; INPUT GIORNO DDMMYY8.; CARDS ; 010186 01 1 86 1 1 86 01/01/86 01-01-86 01 01 86 RUN;

i formati dei tempi e delle date-tempi accettati in INPUT

Formato Legge

TIMEc. ore : minuti : secondi : centesimi di secondo ( hh:mm:ss:cc ) esempio: 12:00 (TIME5.) 12:00:00 (TIME8.) 12:00:00:0 (TIME:10)

DATETIMEc.

2 cifre del giorno ( gg ) 3 lettere del mese in inglese ( mmm ) 2 o 4 cifre dell'anno ( aa o aaaa )

spazio o carattere speciale ore : minuti : secondi : centesimi di secondo ( hh:mm:ss:cc )

Oltre alle costanti numeriche e non numeriche esistono in SAS anche le costanti di data, tempo e data-tempo. Tali costanti possono essere espresse con:

data tempo data-tempo ggmmmaaD hh:mm:ss.cT ggmmmaahh:mm:ss.cDT ggmmmaaaaD

Ci sono anche funzioni specializzate per la gestione delle date e dei tempi Nell’ipotesi che il programma sia stato eseguito il 24 febbraio 1987 alle ore 18

INPUT CODLIBRO PRESTITO DDMMYY6. +1 RITORNO YYMMDD8. ; RITARDO = RITORNO - PRESTITO ; IF RITORNO GT '31DEC1987'D AND RITARDO GT 30 ; CARDS; 1000 270887 87 12 30 1100 301187 88-01-05 1200 250787 88/01/10 1300 271287 19880115 PROC PRINT NOOBS SPLIT = ' # ' ; TITLE 'ESEMPIO DI SCRITTURA DI DATE NON FORMATTATE' LABEL CODLIBRO ='CODICE #LIBRO'; LABEL PRESTITO ='DATA DEL#PRESTITO'; LABEL RITORNO ='DATA DELLA#RESTITUZIONE'; LABEL PRESTITO ='GIORNI DI#RITARDO'; RUN;

ESEMPIO DI SCRITTURA DI DATE NON FORMATTATE CODICE DATA DEL DATA DELLA GIORNI DI LIBRO PRESTITO RESTITUZIONE RITARDO 1100 10195 10231 36 1200 10067 10236 169

PROC PRINT NOOBS SPLIT = ' # ' ; FORMAT PRESTITO RITORNO DDMMYY8. ; TITLE 'ESEMPIO DI SCRITTURA DI DATE FORMATTATE' LABEL CODLIBRO = 'CODICE #LIBRO'; LABEL PRESTITO = 'DATA DEL#PRESTITO'; LABEL RITORNO = 'DATA DELLA#RESTITUZIONE'; LABEL PRESTITO = 'GIORNI DI#RITARDO'; RUN;

ESEMPIO DI SCRITTURA DI DATE FORMATTATE CODICE DATA DEL DATA DELLA GIORNI DI LIBRO PRESTITO RESTITUZIONE RITARDO 1100 30/11/87 05/01/88 36 1200 25/07/87 10/01/88 169

DATA ORA DATANOF ORANOF ANNO TRIM MESE

24/02/87 18:00:00 9916 64800 1987 1 2

GSETT GMESE ORE MINUTI

3 24 18 0

DATA DATA-ORE; DATA = TODAY ( ) ;

ORA = TIME ( ) ; DATANOF = DATA ; ORANOF = ORA ; ANNO = YEAR ( DATA ) ; TRIM = QTR ( DATA ) ; MESE = MONTH ( DATA ) ; GSET = WEEKDAY ( DATA ) ; GMESE = DAY ( DATA ) ; ORE = HOUR ( ORA ) ; MINUTI = MINUTE ( ORA ) ; FORMAT DATA DDMMYY8. ORA TIME 8. ; PROC PRINT NOOBS ; RUN ;

MANIPOLAZIONE DI STRINGHE E CARATTERI Le stringhe sono un insieme di caratteri - lettere, cifre e/o caratteri speciali). Una stringa può essere espressa come:

- variabile non numerica; - contenuto di una variabile non numerica; - risultato di un’espressione non numerica.

La manipolazione riguarda le attività di:

ESTRAZIONE di sottoinsieme di caratteri contenuti in stringhe

CONCATENAMENTO di stringhe

SCANSIONE di stringhe per la ricerca di uno o più caratteri

DETERMINAZIONE della lunghezza di stringhe DATA ABBONATI; INPUT NOME $ 1-5 COGNOME $ 6-11 CODICE $ 12-15 VIA $ 16-36 TELEFONO $ 37-46 CAP $ 47-51 ; CARDS; EMY BOLLA A37FVIA FILLUNGO 2, LUCCA22987-258355100 LELLARIPOLIB5F CORSO ROMA 8, FIENZE325562-05550100 ELIO LUPI AM3MVIA AURELIA 127, PISA67054-05056100 IVA MORI FFF P.ZA DANTE 66, MILANO2286-02 20100 LUIGICORTIZ4M VICOLO CORTO 44, PARMA LIA VERRIF LARGO AUGUSTO 2, ROMA5437615-06 ; RUN;

FUNZIONI INDEX E SUBSTR INDEX ( argomento1 , argomento2 ) ; ricerca in argomento1 la stringa rappresentata da argomento2

la scansione di argomento1 avviene da sinistra a destra

si esaurisce quando trova argomento2

La funzione INDEX dopo la ricerca assume un numero :

- la posizione del primo carattere della stringa specificata in argomento2 - 0 se la ricerca in argomento2 non ha avuto esito

............................. A = 'VIA TURATI N.27 VIAREGGIO' ; RIS1 = INDEX (A , 'VIA' ) ; RIS2 = INDEX ( A , ' VIA'); RIS3 = INDEX ( A, 'via' ); PROC PRINT NOOBS ; RUN ;

RIS1 RIS2 RIS3 1 17 0

SUBSTR ( argomento , posizione [ ,n ] )

a partire da posizione estrae le prime n lettere di argomento

Un altro modo di usare la funzione SUBSTRING è:

SUBSTR ( argomento , posizione [ ,n ] ) = ‘stringa’

Il valore di stringa è posta nella variabile specificata in argomento a partire da posizione e sostituisce il numero di caratteri specificato in n

in questo caso la variabile MACCHINA verrà a essere la stringa FIAT500

...................................... MACCHINA = 'SAAB9000I' ; MARCA = SUBSTR ( MACCHINA, 1, 4) ; MODELLO = SUBSTR ( MACCHINA, 5) ; PROC PRINT NOOBS ; VAR MARCA MODELLO ; RUN ;

MARCA MODELLO SAAB 9000I

...................................... MACCHINA = 'FIAT127' ; SUBSTR ( MACCHINA, 5,3) = ‘5’ | | ‘00’; …………………………

DATA ABBONATI; INPUT NOME $ 1-5 COGNOME $ 6-11 CODICE $ 12-15 VIA $ 16-36 TELEFONO $ 37-46 CAP $ 47-51 ; POS = INDEX ( TELEFONO, '-' ) ; IF POS GT 0 THEN PREFISSO = SUBSTR (TELEFONO, POS+1) ; IF SUBSTR (PREFISSO,1,2) = '05' ; CAEDS ; EMY BOLLA A37FVIA FILLUNGO 2,LUCCA22987-0583 LELLARIPOLIB5F CORSO ROMA 8,FIRENZE325562-055 ELIO LUPI AM3MVIA AURELIA 127,PISA67054-050 ; RUN ; PROC PRINT; RUN ;

C’è da notare che se manca il valore n nella specifiche della funzione SUBSTR, la sottostringa coincide con il resto di argomento a partire dal carattere specifi-cato in posizione.

FUNZIONE LENGTH LENGTH ( argomento ); fornisce la lunghezza dell'espressione specificata dall'argomento

la scansione avviene da destra a sinistra

si esaurisce quando trova uno spazio vuoto

Può essere utile quando la variabile da cui si dovranno estrarre caratteri è di lunghezza variabile

................. VAR = 'ELEONORA ROSSI' ; N = LENGTH (VAR) ; PROC PRINT NOOBS ; VAR N ;

N 8

Per creare un archivio con tante osservazioni quante sono le potenzialità dei clienti e con le variabili:

TELEFONO

PREFISSO

SESSO

DATA OMAGGI ; SET ABBONATI ; /* estrazione del prefisso dal numero telefonico */ POS = INDEX ( TELEFONO, '-' ) ; IF POS GT 0 THEN PREFISSO = SUBSTR (TELEFONO, POS + 1 ) ; IF SUBSTR (PREFISSO , 1 , 2 ) = '05' ; /* determinazione del sesso */ LENGTH SESSO $ 1 ; SESSO = SUBSTR ( CODICE , LENGTH (CODICE) , 1 ) ; IF SESSO = 'F' ; ...............................

OPERATORE DI CONCATENAZIONE e FUNZIONE TRIM

argomento 1 | | argomento 2

10 posizioni per casa e 6 per blanca, quindi l’operatore non elimina i blank TRIM ( argomento )

La funzione TRIM elimina i blank

............................... A = 'CASA ' ; B = 'BLANCA' C = A | | B ;

CASA BLANCA

............................... A = 'CASA ' ; B = 'BLANCA' C = TRIM (A) | | B ;

CASABLANCA

DATA OMAGGI ; SET ABBONATI ; /* estrazione del prefisso dal numero telefonico */ POS = INDEX ( TELEFONO, '-' ) ; IF POS GT 0 THEN PREFISSO = SUBSTR (TELEFONO, POS + 1 ) ; IF SUBSTR (PREFISSO , 1 , 2 ) = '05' ; /* determinazione del sesso */ LENGTH SESSO $ 1 ; SESSO = SUBSTR ( CODICE , LENGTH (CODICE) , 1 ) ; IF SESSO = 'F' ; /* crea la variabile SIGNORA */ SIGNORA = 'Sig.ra ' | | TRIM ( NOME ) | | ' ' | | COGNOME ; ………..

FUNZIONE SCAN SCAN ( argomento , n [ , 'delimitatori' ])

estrae la n-esima parola contenuta in argomento (da sx a dx) oltre a blank i delimitatori riconosciuti dal sistema sono

: < ( + | & * ) ; -- / 0 %

.................................. VAR = 'NEL MEZZO DEL CAMMIN DI NOSTRA VITA ' ; SCAN1 = SCAN (VAR , 4) ; SCAN2 = SCAN (VAR , 2 , ' / ' ) ; ....................................................

SCAN1 = CAMMIN SCAN2 =

DATA OMAGGI ; SET ABBONATI ; /* estrazione del prefisso dal numero telefonico */ POS = INDEX ( TELEFONO, '-' ) ; IF POS GT 0 THEN PREFISSO = SUBSTR (TELEFONO, POS + 1 ) ; IF SUBSTR (PREFISSO , 1 , 2 ) = '05' ; /* determinazione del sesso */ LENGTH SESSO $ 1 ; SESSO = SUBSTR ( CODICE , LENGHT (CODICE) , 1 ) ; IF SESSO = 'F' ; /* crea la variabile SIGNORA */ SIGNORA = 'Sig.ra ' | | TRIM ( NOME ) | | ' ' | | COGNOME ; /* crea le variabili RECAPITO e CITTA */ LENGTH RECAPITO CITTA $ 30 ; RECAPITO = SCAN (VIA, 1 , ',' ) ; CITTA = CAP | | ' ' | | SCAN (VIA, 2 , ',' ) ;

GESTIONE DEI VALORI MANCANTI VALORI MANCANTI DI SISTEMA (derivanti da operazioni non valide) VALORI MANCANTI DI UTENTE (assenza delle informazioni)

rappresentazione dei valori mancanti TIPO DI INPUT PUNTO SPAZIO a colonne SI SI a lista SI NO a formati SI SI Per leggere una variabile non numerica avente per valore un punto si usa il formato $CHAR.

Da notare la dichiarazione CARDS4 in quanto i dati contengono il simbolo ; che non significa la chiusura dei dati: In questo caso la chiusura si fa con ;;;;

DATA SIMBOLI ; INPUT SIMBOLO $CHAR1. NUMERO ; CARDS4; ! 1 , 15 . 12 ; 12 ; ; ; ; RUN ; PROC PRINT DATA = SIMBOLI NOOBS; TITLE ' LETTURA DEI CARATTERI . “ ; ” E CARDS4' ; RUN ;

LETTURA DEI CARATTERI . E ; ' SIMBOLO NUMERO ! 1 , 15 . 12 ; 12

i valori mancanti si possono anche assegnare da programma

si possono avere fino a 27 classi differenziate di valori mancanti

DATA TRASFORM ; INPUT ID RISPOSTA ; IF RISPOSTA = 0 OR RISPOSTA = 9 THEN RISPOSTA = . ; CARDS ; 1 0 2 1 3 1 4 9 5 9 ; PROC FREQ ; TABLES RISPOSTA / MISSING ; RUN ;

CUMULATIVE CUMULATIVE RISPOSTA FREQUENCY PERCENT FREQUENCY FREQUENCY -------------------------------------------------------------------------------------------------

. 3 60.0 3 60.0 1 2 40.0 5 100.0

DATA TRASFORM1 ; SET TRASFORM ; MISSING A B ; IF RISPOSTA = 0 THEN RISPOSTA = 'A' ;

IF RISPOSTA = 9 THEN RISPOSTA = 'B' ; PROC FREQ ; TABLES RISPOSTA / MISSING ; RUN ;

CUMULATIVE CUMULATIVE RISPOSTA FREQUENCY PERCENT FREQUENCY FREQUENCY ------------------------------------------------------------------------------------------------- A 1 20.0 1 20.0 B 2 40.0 3 60.0 1 2 40.0 5 100.0

si può sapere se una variabile contiene un valore mancante in caso di variabile numerica il confronto va fatto con il punto in caso di variabile non numerica esistono diversi tipi di confronto

In una dichiarazione IF il confronto con valore mancante equivale a

- confronto con il più piccolo valore numerico possibile; - confronto con una risposata contenente spazi e, quindi, la più piccola

possibile

in presenza di missing occorre far uso di funzioni e opzioni adatte, cioè che risolvono I problemi dei missing ignorandoli

DATA _NULL_ ; INPUT QUEST RISPO $ ; IF QUEST = . THEN IF RISPO = '' THEN IF RISPO = . THEN IF RISPO = ' ' THEN

DATA FUNZIONI; INPUT NUMERO1 NUMERO2 NUMERO3; TOT1 = NUMERO1 + NUMERO2 + NUMERO3 ; TOT2 = SUM (NUMERO1, NUMERO2, NUMERO3) ; MEDIA1 = (NUMERO1 + NUMERO2 + NUMERO3) / 3 ; MEDIA2 = MEAN (NUMERO1, NUMERO2, NUMERO3) ; CARDS; 10 20 30 40 . 60 PROC PRINT NOOBS; RUN ;

NUMERO1 NUMERO2 NUMERO3 TOT1 TOT2 MEDIA1 MEDIA2 10 20 30 60 60 20 20 40 . 60 . 100 . 50

LE VARIABILI AUTOMATICHE

vengono assegnate al PVD direttamente dal sistema

_N_ conta il numero di esecuzioni del passo di DATA _ERROR_ = 0 se non si rilevano errori nel ciclo di esecuzione del

passo di DATA = 1 se viene rilevato almeno un errore nel ciclo di esecu-

zione del passo di DATA

DATA LEGGI ; IF _N_ = 1 THEN SET MIEI.VALORI ; IF _N_ GT MAXREC THEN STOP ; SET DISCO ; IF _ERROR_ = 1 THEN STOP ;

DICHIARAZIONE RETURN

l'esecuzione di RETURN: - interrompe il ciclo di esecuzione

- riporta all'inizio del passo di DATA

- pone a missing le variabili del PVD per cui non c'è una RETAIN

- fa incrementare di un'unità la _N_

in questo caso RETAIN non ha effetto perché l’osservazione viene scritta prima di eseguire la dichiarazione di IF

DATA POSITIVI ; INPUT NUMERO ; IF NUMERO LE 0 THEN RETURN ; CARDS; 10 -1 20 PROC PRINT; RUN;

OBS NUMERO 1 10 2 -1 3 20

se invece si aggiunge la dichiarazione di OUTPUT

DATA POSITIVI ; INPUT NUMERO ; IF NUMERO LE 0 THEN RETURN ; ELSE OUTPUT; 10 -1 20 PROC PRINT; RUN;

OBS NUMERO 1 10 2 20

ETICHETTE E DICHIARAZIONE GO TO

GO TO etichetta; ....................... etichetta : ...................... RETURN; Permette di saltare nel punto preciso del programma dove è presente l’etichetta

o, equivaletemene, si può esprimere in forma più compatta nel seguente modo

DATA POSITIVI NEGATIVI ; INPUT NUMERO ; IF NUMERO GT 0 THEN GO TO POSITIVI ;

IF NUMERO LT 0 THEN GO TO NEGATIVI ;

RETURN ; POSITIVI: OUTPUT POSITIVI ; RETURN ;

NEGATIVI: OUTPUT NEGATIVI ; RETURN ;

DATA POSITIVI NEGATIVI ; INPUT NUMERO ; IF NUMERO = 0 THEN RETURN ; ELSE IF NUMERO GT 0 THEN OUTPUT POSITIVI ; IF NUMERO LT 0 THEN OUTPUT NEGATIVI ;

LA DICHIARAZIONE LINK LINK etichetta ............................. etichetta ; Permette di saltare nel punto preciso del programma dove è presente l’etichetta

DATA CALCOLA ; DROP N ; INPUT N A B ; IF N = 2 THEN LINK CALC2 ;

ELSE LINK CALC1; IF TOTALE GT 0 THEN OUTPUT ; RETURN ; CALC1 : TOTALE = A + B ; RETURN ;

CALC2 : TOTALE = A - B ; RETURN ; CARDS; 1 2 3 2 4 3 3 4 5 PROC PRINT; RUN ;

OBS A B TOTALE 1 2 3 5 2 4 3 1 3 4 5 9

LA DICHIARAZIONE DO DO indice = inizio [ TO fine [ BY incremento ] ] [ , inizio [ TO fine [ BY incremento ] ]]......; .......................................... END ; Permette di l’esecuzione di un gruppo di istruzioni che si trovano fra le dichia-razioni DO ed END Gli incrementi possono esprimersi in diversi modi

DO I = 1 TO 10 ; DO I = 1 TO 10 BY 1 ; DO I = 10 TO 1 BY -2 ; DO I = 0 TO 1 BY .3 ; DO DATA = '01JAN94'D TO '31DEC94'D BY 30 ;

N = 3 DO INDICE = N TO 2 BY 1 ; (non viene mai eseguito) DO INDICE = 100 ; (viene eseguito una sola volta) DO INDICE = 1, 5, 10, 50, 100 ; (non viene mai eseguito) DO GIORNO = 'DOMENICA' , 'LUNEDI' ; (viene eseguito 2 volte) DO I = 1 TO 10 BY 1 , 10 TO 1 BY -1 ; (viene eseguito 20 volte)

DO WILE ( espressione ) ; ................................... END ; Esce dal ciclo quando espressione non è più verificata DO UNTIL ( espressione ) ; ................................... END ; Esce dal ciclo quando espressione è verificata

I cicli si concludono quando il montante supera 50 milioni

DATA RENDITA ; CAPITALE = 200 ; ANNO = 1985 ; DO WHILE ( CAPITALE LE 500 ) ; /* DO UNTIL ( CAPITALE GT 500 ) ; */ CAPITALE = CAPITALE + CAPITALE *0.1 ; ANNO = ANNO + 1 ; END ; PROC PRINT NOOBS ; RUN ;

DATA RENDITA ; CAPITALE = 200 ; DO ANNO = 1985 TO 1999 WHILE ( CAPITALE LE 500 ) ; CAPITALE = CAPITALE + CAPITALE *0.1 ; END ; PROC PRINT NOOBS ; RUN ;

CAPITALE ANNO 51874849 1995

LA DICHIARAZIONE ARRAY

ARRAY < nome array > { n } [ $ ] [ lunghezza ] elementi ;

n = numero elementi dell'array (la parentesi graffa fa parte della sintassi) se nella specifica n si pone * il sistema calcolerà il numero degli elementi

$ = array non numerico

lunghezza = lunghezza degli elementi non definiti prima

elementi = variabili che compongono l'array Permette la gestione di aree di memoria omogenee senza lasciare

traccia nel PVD trattandosi di una sovrastruttura logica che per-

mette di riferire una singola variabile a un elemento dell’array

esempi

lettura di 10 variabili numeriche assegnate all’array RISPOSTA ARRAY RISPOSTA { 10 } R1 R2 R3 R4 R5 R6 R7 R8 R9 R10 ;

ARRAY RISPOSTA { 10 } R1-R10 ;

ARRAY RISPOSTA { * } R10-R1 ; lettura di 10 variabili stringa assegnate all’array LETTERE ARRAY LETTERE { 5 } $ A B C D E ; lettura delle variabili stringa che si trovano fra le variabili NOME e SESSO ARRAY CAR { * } NOME--SESSO ;

organizzazione di variabili in array

equivale a

ovvero

in questo caso RISPOSTA { 1 } corrisponde a R1 RISPOSTA { 2 } corrisponde a R2 ……………………… RISPOSTA { 10 } corrisponde a R10

DATA RISPOSTA; SET RISPOSTE ; INPUT R1-R10 ; IF R1 = 9 THEN R1 = . ; IF R2 = 9 THEN R2 = . ; IF R3 = 9 THEN R3 = . ; IF R4 = 9 THEN R4 = . ; IF R5 = 9 THEN R5 = . ; IF R6 = 9 THEN R6 = . ; IF R7 = 9 THEN R7 = . ; IF R8 = 9 THEN R8 = . ; IF R9 = 9 THEN R9 = . ; IF R10 = 9 THEN R10 = . ; RUN;

DATA RISPOSTA1; DROP I ; SET RISPOSTE ; ARRAY RISPOSTA { 10 } R1-R10 ; INPUT R1-R10 ; DO I = 1 TO 10 ; IF RISPOSTA ( I ) = 9 THEN RISPOSTA ( I ) = . ; END ; RUN;

DATA RISPOSTA2; DROP I ; SET RISPOSTE ; ARRAY RISPOSTA { * } R1-R10 ; INPUT R1-R10 ; DO I = 1 TO DIM (RISPOSTA) ; IF RISPOSTA ( I ) = 9 THEN RISPOSTA ( I ) = . ; END ; RUN;

Mentre in questo caso

RISPOSTA { 1 } corrisponde a R10 RISPOSTA { 2 } corrisponde a R1 RISPOSTA { 3 } corrisponde a R2 RISPOSTA { 4 } corrisponde a R3 ………………………

DATA RISPOSTA3; DROP I ; SET RISPOSTE ; ARRAY RISPOSTA { 10 } R10 R1 R2-R9 ; INPUT R1-R10 ; DO I = 1 TO 10 ; IF RISPOSTA ( I ) = 9 THEN RISPOSTA ( I ) = . ; END ;

definizione di nuove variabili con array

DATA PERCENTO ; DROP I MESE1-MESE12 TOTALE ; INPUT ANNO MESE1-MESE12 ; TOTALE = SUM ( OF MESE1-MESE12 ) ; ARRAY LAVORI { 12 } MESE1-MESE12 ;

ARRAY PERCENT { 12 } PC1-PC12 ; DO I = 1 TO 12 PERCENT ( I ) = ( LAVORI ( I ) / TOTALE ) * 100 ; END ; CARDS ; 1990 1500 1400 1600 1800 2200 2500 1200 600 1800 2500 2800 3200 1991 1800 1700 1900 2000 3000 3300 1400 750 2000 2800 3200 4000 RUN ; PROC PRINT NOOBS ; FORMAT PC1-PC12 4.1; RUN ;

ANNO PC1 PC2 PC3 PC4 PC5 PC6 PC7 PC8 PC9 PC10 PC11 PC12 1990 6.5 6.1 6.9 7.8 9.5 10.8 5.2 2.6 7.8 10.8 12.1 13.9 1991 6.5 6.1 6.8 7.2 10.8 11.8 5.0 2.7 7.2 10.1 11.5 14.4

CONVERSIONE DA NON NUMERICO A NUMERICO

IMPLICITA

il sistema converte automaticamente se la variabile non numerica viene:

- assegnata a una variabile numerica

- utilizzata in operazioni aritmetiche

- confrontata con operatori logici a una variabile numerica

- usata in una funzione che prevede argomenti numerici

Le conversioni vengono segnalate sulla finestra SASLOG.

Se non produce un risultato significativo, oltre al messaggio di errore in

SASLOG, la variabile assume valore mancante e la variabile automatica

_ERROR_ assume valore 1.

ESPLICITA

INPUT ( argomento , formato. ) ;

DATA CONVERTI; VARC = '100' ; VARCERR = 'MAMMA' ; VARN = VARCERR + 100 ; /* VARN = 200 */ VARN = VARC + 100 ; /* VBRN = . */ IF ( VARC = 100 ) THEN VARN + 1 ; /* VARN = 201 */ VARN = VARC ; /* VARN = 100 */ TOTALE = SUM (VARN + VARC) ; /* TOTALE = 200 */ RUN;

DATA NASCITE ; INPUT NOME $10. NASCITA $ 8. ; CARDS ; FRANCESCO 22/11/82 MONICA 16/11/78 ; DATA ETA ; SET NASCITE ; ANNI = 2004 - YEAR ( INPUT ( NASCITA , DDMMYY8.)) ; RUN ;

CONVERSIONE DA NUMERICO A NON NUMERICO

IMPLICITA

il sistema converte automaticamente se la variabile numerica viene:

- assegnata a una variabile non numerica con il formato BESTc. Dive c è la lunghezza della variabile non numerica

- usata in una funzione che prevede argomenti non numerici

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 0 0 1 0 0 R O M A S A A B 9 0 0 0 0

DATA BESTX ; A = 'AF'; /*variabile non numerica lunga 2 B = 'SAS' ; /*variabile non numerica lunga 3 C = 'GRAPH' ; /*variabile non numerica lunga 5 N = 1267 ; /*variabile numerica lunga 8 A = N ; /* A e' convertito in BEST2 ma non riesce a visualizzarlo in 2 posizioni B = N ; /* B e' convertito in BEST3 cioe' le 3 posizioni richieste da N */ C = N ; / * 1267 e' convertito in BEST5 */

DATA SORPRESA ; CAP = 00100 ; CITTA = 'ROMA' ; MARCA = 'SAAB' ; MODELLO = 90000 ; VAR1 = CAP | | CITTA ; VAR2 = MARCA | | MODELLO ; PROC PRINT NOOBS ; RUN ;

CAP CITTA MARCA MODELLO VAR1 VAR2 00100 ROMA SAAB 90000 00100ROMA SAAB 90000

ESPLICITA

PUT ( argomento , formato )

argomento = può essere una variabile, costante o espressione non numerica

formato = deve essere coerente con l’argomento

lunghezza = lunghezza degli elementi non definiti prima Il risultato è sempre una stringa:

- con argomento numerico risultato = stringa allineata a destra

- con argomento non numerico risultato = numero allineato a sinistra

1 2 3 4 5 6 7 8 9 0 0 1 0 0 R O M A S A A B 9 0 0 0 0

DATA SORPRESA1; CAP = 00100 ; CITTA = 'ROMA' ; MARCA = 'SAAB' ; MODELLO = '90000' ; VAR1 = PUT ( CAP , 5. ) | | CITTA ;

VAR2 = MARCA | | PUT ( MODELLO , 5. ) ; PROC PRINT NOOBS ; RUN ;

CAP CITTA MARCA MODELLO VAR1 VAR2 00100 ROMA SAAB 90000 00100ROMA SAAB90000

LEFT ( argomento ) sposta i blank dalla sinistra alla destra di argomento

DATA SORPRESA 2; CAP = 00100 ; CITTA = 'ROMA' ; MARCA = 'SAAB' MODELLO = '90000' ; VAR1 = CAP | | CITTA ; VAR2 = MARCA | | LEFT ( MODELLO ) ; PROC PRINT NOOBS ; RUN ;

CAP CITTA MARCA MODELLO VAR1 VAR2 00100 ROMA SAAB 90000 00100ROMA SAAB90000