LA GESTIONE DELLE DATE E DEI TEMPI i formati delle date
by user
Comments
Transcript
LA GESTIONE DELLE DATE E DEI TEMPI i formati delle date
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 Legge Formato DDMMYYc. MMDDYYc. YYMMDDc. giorno mese anno mese giorno anno 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 TIMEc. Legge ore : minuti : secondi : centesimi di secondo ( hh:mm:ss:cc ) esempio: 12:00 12:00:00 12:00:00:0 DATETIMEc. (TIME5.) (TIME8.) (TIME:10) 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 ggmmmaaD ggmmmaaaaD tempo hh:mm:ss.cT data-tempo ggmmmaahh:mm:ss.cDT INPUT CODLIBRO 1000 1100 1200 1300 PROC PRESTITO DDMMYY6. +1 RITORNO YYMMDD8. ; RITARDO = RITORNO - PRESTITO ; IF RITORNO GT '31DEC1987'D AND RITARDO GT 30 ; CARDS; 270887 87 12 30 301187 88-01-05 250787 88/01/10 271287 19880115 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 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 DATA DATA-ORE; DATA = TODAY ( ) ; TIME ( ) ; ORA = DATANOF = DATA ; ORANOF = ORA ; ANNO = TRIM = MESE = GSET = GMESE = ORE = MINUTI = YEAR ( DATA ) ; QTR ( DATA ) ; MONTH ( DATA ) ; WEEKDAY ( DATA ) ; DAY ( DATA ) ; HOUR ( ORA ) ; MINUTE ( ORA ) ; FORMAT DATA DDMMYY8. ORA TIME 8. ; PROC PRINT NOOBS ; RUN ; 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 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 ............................. A = 'VIA TURATI N.27 VIAREGGIO' ; RIS1 = INDEX (A , 'VIA' ) ; RIS2 = INDEX ( A , ' VIA'); RIS3 = INDEX ( A, 'via' ); PROC PRINT NOOBS ; RUN ; RIS1 1 RIS2 17 RIS3 0 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 SUBSTR ( argomento , posizione [ ,n ] ) a partire da posizione estrae le prime n lettere di argomento ...................................... MACCHINA = 'SAAB9000I' ; MARCA = SUBSTR ( MACCHINA, 1, 4) ; MODELLO = SUBSTR ( MACCHINA, 5) ; PROC PRINT NOOBS ; VAR MARCA MODELLO ; RUN ; MARCA SAAB MODELLO 9000I 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 ...................................... MACCHINA = 'FIAT127' ; SUBSTR ( MACCHINA, 5,3) = ‘5’ | | ‘00’; ………………………… in questo caso la variabile MACCHINA verrà a essere la stringa FIAT500 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 specificato 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 ................. VAR = 'ELEONORA ROSSI' ; N = LENGTH (VAR) ; PROC PRINT NOOBS ; VAR N ; N 8 Può essere utile quando la variabile da cui si dovranno estrarre caratteri è di lunghezza variabile 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 ............................... A = 'CASA ' ; B = 'BLANCA' C=A||B; CASA BLANCA 10 posizioni per casa e 6 per blanca, quindi l’operatore non elimina i blank TRIM ( argomento ) ............................... A = 'CASA ' ; B = 'BLANCA' C = TRIM (A) | | B ; CASABLANCA La funzione TRIM elimina i blank 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 a colonne a lista a formati PUNTO SPAZIO SI SI SI SI NO SI Per leggere una variabile non numerica avente per valore un punto si usa il formato $CHAR. 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 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 ;;;; i valori mancanti si possono anche assegnare da programma 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 ------------------------------------------------------------------------------------------------- . 1 3 2 60.0 40.0 3 5 60.0 100.0 si possono avere fino a 27 classi differenziate di valori mancanti 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 DATA _NULL_ ; INPUT QUEST IF QUEST IF RISPO IF RISPO IF RISPO RISPO $ ; = . THEN = '' THEN = . THEN = '' THEN 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 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 10 20 40 . NUMERO3 TOT1 TOT2 MEDIA1 MEDIA2 30 60 60 20 20 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 esecuzione 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_ DATA POSITIVI ; INPUT NUMERO ; IF NUMERO LE 0 THEN RETURN ; CARDS; 10 -1 20 PROC PRINT; RUN; in questo caso RETAIN non ha effetto perché l’osservazione viene scritta prima di eseguire la dichiarazione di IF OBS NUMERO 1 10 2 3 -1 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 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 ; o, equivaletemene, si può esprimere in forma più compatta nel seguente modo 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 2 4 4 3 3 5 5 1 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 dichiarazioni 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 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 ; I cicli si concludono quando il montante supera 50 milioni CAPITALE 51874849 ANNO 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 permette 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 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; equivale a 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; ovvero 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; in questo caso RISPOSTA { 1 } corrisponde a R1 RISPOSTA { 2 } corrisponde a R2 ……………………… RISPOSTA { 10 } corrisponde a R10 Mentre in questo caso 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 ; RISPOSTA { 1 } corrisponde a R10 RISPOSTA { 2 } corrisponde a R1 RISPOSTA { 3 } corrisponde a R2 RISPOSTA { 4 } corrisponde a R3 ……………………… 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 1991 6.5 6.5 6.1 6.1 6.9 6.8 7.8 9.5 7.2 10.8 10.8 5.2 11.8 5.0 2.6 2.7 7.8 7.2 10.8 10.1 12.1 11.5 13.9 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 DATA CONVERTI; VARC = '100' ; VARCERR = 'MAMMA' ; VARN = VARCERR + 100 ; VARN = VARC + 100 ; /* VARN = 200 */ /* VBRN = . */ IF ( VARC = 100 ) THEN VARN + 1 ; /* VARN = 201 */ VARN = VARC ; /* VARN = 100 */ TOTALE = SUM (VARN + VARC) ; /* TOTALE = 200 */ RUN; 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 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 DATA BESTX ; A = 'AF'; B = 'SAS' ; C = 'GRAPH' ; N = 1267 ; A= N ; B= N; C= N; /*variabile non numerica lunga 2 /*variabile non numerica lunga 3 /*variabile non numerica lunga 5 /*variabile numerica lunga 8 /* A e' convertito in BEST2 ma non riesce a visualizzarlo in 2 posizioni /* B e' convertito in BEST3 cioe' le 3 posizioni richieste da N */ / * 1267 e' convertito in BEST5 */ - usata in una funzione che prevede argomenti non numerici DATA SORPRESA ; CAP = 00100 ; CITTA = 'ROMA' ; MARCA = 'SAAB' ; MODELLO = 90000 ; VAR1 = CAP | | CITTA ; VAR2 = MARCA | | MODELLO ; PROC PRINT NOOBS ; RUN ; CAP CITTA MARCA 00100 ROMA SAAB 1 2 3 4 MODELLO 90000 5 6 7 VAR1 VAR2 00100ROMA 8 SAAB 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 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 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 00100 ROMA MARCA MODELLO SAAB 90000 1 2 3 4 VAR1 VAR2 00100ROMA 5 6 7 8 9 0 0 1 0 0 R O M A S A A B 9 0 0 0 0 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 00100 ROMA MARCA SAAB MODELLO 90000 VAR1 00100ROMA VAR2 SAAB90000