...

LA GESTIONE DELLE DATE E DEI TEMPI i formati delle date

by user

on
Category: Documents
11

views

Report

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
Fly UP