3. GENERALITÀ SULLE PROCEDURE SAS 3.1...
Transcript of 3. GENERALITÀ SULLE PROCEDURE SAS 3.1...
1
3. GENERALITÀ SULLE PROCEDURE SAS
3.1 Introduzione
Come è stato detto in precedenza, l’elaborazione dei dati con il programma SAS viene generalmente
effettuata mediante i PROC STEP (o passi di PROC), ossia mediante l’esecuzione di procedure che
indicano al sistema il tipo di analisi che si desidera effettuare.
Una qualsiasi procedura contenuta nelle librerie del sistema SAS è infatti un programma
preconfezionato in grado di effettuare un particolare tipo di elaborazione dei dati.
I dati su cui operano queste procedure devono essere in formato SAS.
Con un PROC STEP si possono creare anche altri dataset SAS che a loro volta possono essere
analizzati successivamente da altri passi di DATA o di PROC.
Un PROC STEP inizia con la parola chiave “proc” seguita dal nome della procedura che si vuole
eseguire e termina con un DATA STEP, con un altro PROC STEP o con l'istruzione finale run;.
Tutte le volte in cui si dispone di una procedura che consente di eseguire il tipo di analisi desiderata
l’utente avrà il solo compito di individuare la procedura stessa e di selezionare le opzioni desiderate.
Le procedure note al SAS sono estremamente numerose, tanto che il solo modulo del SAS Base ne
contiene una settantina, a cui si aggiungono numerose altre procedure disponibili nei moduli più
specializzati in determinati tipi di elaborazione dei dati.
In generale un qualsiasi PROC STEP ha le seguenti caratteristiche
- Comincia sempre con la parola chiave “proc”;
- Si compone di un insieme di istruzioni;
- Produce un output di default sulla finestra di output;
- Può produrre un output più complesso o più leggero utilizzando le opzioni (di default le procedure
calcolano gli indici statistici più noti, ma se ne possono richiedere altri, attraverso specifiche opzioni)
2
3.2 Le procedure di visualizzazione dei data set (Proc PRINT, FORMAT e CONTENTS)
Nelle pagine precedenti abbiamo già utilizzato la procedura che visualizza a terminale il contenuto di
un data set SAS (proc print) e la procedura che permette di vedere le caratteristiche delle variabili
che lo compongono, elencate in ordine alfabetico (proc contents).
Come tutte le altre PROC presenti nel SAS anche queste procedure possono essere personalizzate
utilizzando delle opportune opzioni. In queste dispense verranno esplicitamente considerate solo quelle
più comuni, dato che l’elenco completo e la loro descrizione è reperibile nel manuale online messo a
disposizione dal software.
La sintassi più semplice della Proc PRINT è
proc print data=<nome_del_dataset>;
var <elenco delle variabili, separate da almeno uno spazio bianco>;
format <elenco delle variabili, ciascuna con l’indicazione del formato>;
L’istruzione “var” serve per specificare le variabili da stampare, nell’ordine in cui vengono elencate.
La sua omissione fa sì che il programma stampi tutte le variabili contenute nel dataset, nell’ordine in
cui sono state lette. Se viene omesso il nome del data set da stampare, per default il SAS stamperà
l’ultimo data set.
Considerato per esempio il seguente data set che riporta il tasso di occupazione, il tasso di
disoccupazione ed il tasso di attività dei cinque comuni di una provincia italiana
data tassi;
input tasso_occup tasso_disocc tasso_attiv;
cards;
0.4861 0.0847 0.5320
0.5244 0.0741 0.5446
0.5367 0.0936 0.5939
0.4908 0.1004 0.5245
0.6468 0.0889 0.5892
;
se si volessero visualizzare a terminale solo i tassi di occupazione e di disoccupazione, il primo
espresso da 2 cifre decimali ed il secondo espresso con 3 cifre decimali, si potrebbero utilizzare le
seguenti istruzioni
3
Esempio 3.2.1
proc print data=tassi;
var tasso_occup tasso_disocc;
format tasso_occup 4.2 tasso_disocc 5.3;
run;
che genera questo output
Oss tasso_occup tasso_disocc
1 0.49 0.085
2 0.52 0.074
3 0.54 0.094
4 0.49 0.100
5 0.65 0.089
Come in tutte le procedure che danno luogo ad un output, anche la proc print dà la possibilità di
inserire una o più righe contenente i titoli che si vogliono assegnare mediante la parola chiave “title”
seguita dal numero della riga su cui deve comparire il titolo, da uno spazio bianco e dal testo del titolo,
racchiuso fra apici. La prima riga di titolo può essere indicata con “title1” o, più semplicemente, con
“title”, mentre le righe di titolo successive devono necessariamente contenere l’indicazione numerica
della riga.
Così, per esempio, se si volessero utilizzare 3 titoli, su tre righe diverse, si dovrebbero utilizzare le
righe
title 'testo del primo titolo';
title2 'testo del secondo titolo';
title3 'testo del terzo titolo';
Se, per esempio, si volesse stampare il data set precedente inserendo le seguenti due righe
Comuni della provincia X
Tassi di occupazione e di disoccupazione
si potrebbe utilizzare il seguente programma
4
proc print data=tassi;
var tasso_occup tasso_disocc;
format tasso_occup 4.2 tasso_disocc 5.3;
title 'Comuni della provincia X';
title2 'Tassi di occupazione e di disoccupazione';
run;
Va notato che le istruzioni relative ai titoli sono memorizzate dal SAS, nel senso che restano valide fino
a quando non viene chiusa la sessione di lavoro. Pertanto, una volta indicato un titolo, sarà necessario
modificarlo negli step successivi.
La proc print consente anche di stampare solo un certo numero di record, a partire dal primo o da
uno qualsiasi. Questo risultato viene utilizzando opportune opzioni fra parentesi, dopo il nome del data
set da visualizzare.
Per stampare solo le prime k osservazioni l’opzione è
proc print data=<nome_del_dataset>(obs=k);
mentre per stamparne k, a partire dalla m-esima, l’opzione da utilizzare è la seguente
proc print data=<nome_del_dataset> (firstobs=m obs=m+k-1);
Per esempio, nella prima proc print dell’esempio successivo si chiede al programma di stampare solo
i primi 2 record, mentre con la seconda proc print vengono visualizzati solo 2 record, a partire dal
terzo.
Esempio 3.2.2
proc print data=tassi (obs=2);
proc print data=tassi (firstobs=3 obs=4);
5
La Proc FORMAT viene invece usata per creare una libreria di format permanenti da utilizzare nei
DATA step o nei PROC step.
La sua sintassi è
proc format <opzioni>;
invalue <elenco delle variabili in input e loro formato >;
value <elenco delle variabili in output e loro formato >;
dove si userà l’istruzione “invalue” e/o “value” a seconda che si voglia attribuire un formato alle
variabili lette e/o alle variabili create.
Di seguito è riportato un esempio di questa procedura applicato ad un data set contenente alcune
variabili rilevate su 4 studenti universitari: matricola, sesso, se si tratta di studente in corso o fuori
corso e se lo studente ha ottenuto almeno 40 CFU.
Esempio 3.2.4
proc format;
value $sesso 'm'='maschio'
'f'='femmina';
value si_no 1='sì'
2='no';
data stud1;
input matricola 6. @8 genere $1. @10 incorso 1. @12 almeno40CFU 1.;
format genere $sesso.
incorso si_no.
almeno40CFU si_no.;
cards;
101122 m 1 1
101132 f 2 1
101234 f 1 2
101321 m 2 1
;
proc print;
run;
Mediante la proc format si stabilisce un formato, denominato “$sesso”, che potrà essere utilizzato
per variabili alfanumeriche che possono assumere solo le determinazioni “m” oppure “f”, ed un
formato, denominato “si_no”, utilizzabile per variabili numeriche che possono assumere solo i valori 1
oppure 2.
Nell’esempio considerato le istruzioni utilizzate nella proc format servono per stabilire che alle
determinazioni “m” e “f” assunte dalla variabile “genere” corrispondono i formati “maschio” e
6
“femmina”, mentre ai valori “1” e “2” delle variabili “incorso” e “almeno40CFU” corrispondono
rispettivamente le determinazioni “sì” e “no”.
L’attribuzione dei formati prestabiliti nella proc format alle tre variabili considerate viene effettuata
all’interno del DATA step, dopo l’istruzione input che elenca le variabili contenute nell’archivio
denominato “dataset1”.
La visualizzazione dei formati prestabiliti viene effettuata con la proc print che stampa a terminale la
seguente tabella
Oss matricola genere incorso almeno40CFU
1 101122 maschio sì sì
2 101132 femmina no sì
3 101234 femmina sì no
4 101321 maschio no sì
La procedura può essere utilizzata anche per costruire una variabile che assume determinazioni diverse
per diverse classi di valori di una variabile numerica che assume molti valori diversi. Nell’esempio
successivo si attribuisce la determinazione “bassa” ad una votazione compresa nell’intervallo [18, 23],
la determinazione “media” ad una votazione compresa nell’intervallo [24, 27] e la determinazione
“alta” ad una votazione maggiore o uguale a 28.
Esempio 3.2.5
proc format;
value votaz 18-23='bassa'
24-27='media'
28-30='alta';
La Proc CONTENTS serve per descrivere le caratteristiche di un archivio, restituendo il percorso del
file, il suo nome (completo di estensione) e il formato delle variabili.
La sua sintassi è
7
proc contents data=<nome_del_dataset>;
dove, se viene omesso il nome del data set, per default il SAS prenderà in esame l’ultimo. Se, per
esempio si considerano le seguenti istruzioni
Esempio 3.2.3
data archivio;
input x y $ z;
format x comma12.3 y $7. z 1.;
cards;
3455.457 piccolo 0
7568.903 medio 1
11777.346 grande 1
;
proc contents;
run;
si otterranno le seguenti informazioni relative alle variabili
Elenco alfabetico di variabili e attributi
# Variabile Tipo Lungh Formato
1 x Num 8 COMMA12.3
2 y Alfanum 8 $7.
3 z Num 8 1.
8
3.3 La Proc IMPORT
La lettura di file esterni con un formato diverso dal SAS e dall’ASCII viene effettuata mediante la Proc
IMPORT indicando in chiaro il percorso da seguire, il nome esatto del file (completo di estensione) e
il formato del file.
Il percorso da seguire non deve essere più lungo di 201 caratteri.
Per default, la Proc IMPORT considera i record a lunghezza variabile, per cui se il formato è a
lunghezza fissa occorre usare un DATA STEP in cui sia specificata un’istruzione INFILE che includa
le opzioni RECFM=F e LRECL=.
La sintassi è
PROC IMPORT DATAFILE="filename" | TABLE="tablename"
OUT=<libref.>SAS data set <(SAS data set option(s))>
<DBMS=identifier> <REPLACE>;
per cui va innanzitutto specificato se si tratta di:
- un data set: in questo caso si usa l’istruzione datafile = <nome_del_file>)
- una tabella: in questo caso si usa l’istruzione datatable = <nome_della_tabella>)
L’opzione “out=” serve per definire il nome del data set SAS che viene creato dalla lettura del file e
può essere sia temporaneo, sia permanente (a seconda della libreria associata) e può essere completata
con ulteriori opzioni facoltative relative alle caratteristiche del data set che si crea.
L’opzione “dbms=” serve per indicare al software il formato dei dati o della tabella da importare e può
assumere le determinazioni riportate nella prima colonna della tabella 3.3.1, mentre nella seconda
colonna è specificata l’estensione del file.
L’opzione “replace”, opzionale, va usata solo se si desidera sovrascrivere il file importato e va usata
con attenzione.
9
Tabella 3.3.1
Codifica dei file
Identificativo
DBMS Descrizione file
Estensione
file
ACCESS Microsoft Access 2000, 2002, 2003, 2007, 2010, and later table. The ACCESS LIBNAME
engine is used when DBMS=ACCESS.
.mdb
.accdb
ACCESSCS Microsoft Access table connecting remotely through SAS PC Files Serverusing the PCFILES
LIBNAME engine.
.mdb
.accdb
CSV Delimited file with comma-separated values .csv
DBF dBASE 5.0, IV, III+, and III files .dbf
DBFMEMO dBASE 5.0, IV, III+, and III files with memos FoxPro and Visual FoxPro files with memos
.dbf
.fpt
.dbt
DLM Delimited file (default delimiter is a blank) .*
DTA Stata file .dta
EXCEL Microsoft Excel 97, 2000, 2002, 2003, 2007, 2010, and later workbook using the LIBNAME
statement.
.xls
.xlsb
.xlsm
.xlsx
EXCEL4
EXCEL5 Microsoft Excel 4.0, Excel 5.0 or 7.0 (95) workbook. .xls
EXCELCS Microsoft Excel workbook connecting remotely through SAS PC Files Server. .xls,.xlsx,
.xlsb, xlsm
JMP JMP files in Version 7 and later format. .jmp
PARADOX Paradox DB files .db
PCFS (SAS PC
Files Server)
Microsoft Excel workbook files, JMP files, SPSS files, and Stata files connecting remotely
through SAS PC Files Server.
.xls, .jmp,
.sav, .dta
SAV SPSS file .sav
TAB Delimited file (tab-delimited values) .txt
WK1 Lotus1-2-3 Release 2 spreadsheet .wk1
WK3 Lotus 1-2-3 Release 3 spreadsheet .wk3
WK4 Lotus 1-2-3 Release 4 or 5 spreadsheet .wk4
XLS
Microsoft Excel 5.0, 95, 97, 2000, 2002, or 2003 workbook using file formats
Note: Transcoding is not supported for DBMS=XLS. Attempted execution of this operation
yields unpredictable results. Use DBMS=EXCEL or DBMS=EXCELCS with the SAS PC Files
Server as an alternative. Or, if your file has more than 255 columns, save the .xls file as .xlsx to
support transcoding.
.xls
XLSX Microsoft Excel 2007 and later workbook using file formats
10
Esempio 3.3.1
Considerato il file excel “occup.xlsx” contenuto in “c:\users\naddeo\desktop\” il programma per creare
un file SAS permanente di nome “occup” nella medesima directory è il seguente
libname libr1 "c:\users\naddeo\desktop\";
proc import datafile="c:\users\naddeo\desktop\occup.xlsx"
dbms=excel
out=libr1.occup;
proc print;
run;
11
3.4 La Proc EXPORT
La procedura per effettuare il processo inverso rispetto a quello appena descritto è la Proc EXPORT,
che consente di leggere un data set SAS e di scriverlo in un formato differente.
La sintassi di questa procedura è
PROC EXPORT DATA=<libref.>SAS data set <(SAS data set option(s))>
OUTFILE="filename" | OUTTABLE="tablename"
<DBMS=identifier> <REPLACE> <LABEL>;
dove l’istruzione “dbms=” può assumere le determinazioni indicata nella tabella 3.3.1 del precedente
paragrafo. Ik programma seguebte, per esempio, crea un file EXCEL.
Esempio 3.4.1
data studenti;
input sesso $ eta;
cards;
m 23
f 19
m 18
m 22
f 25
f 26
;
proc export data=studenti
dbms=xlsx
outfile="c:\users\naddeo\desktop\stud";
run;
Se si specifica l’opzione DBMS=DLM per creare un file delimitato si può aggiungere l’indicazione
circa il delimitatore (che separa le singole determinazioni delle variabili) mediante l’istruzione
DELIMITER=’delimitatore’;
dove il delimitatore deve essere racchiuso fra apici (o virgolette), per cui se si desidera usare il simbolo
& (al posto dello spazio bianco previsto per default) l’istruzione assumerà la forma
12
DELIMITER='&';
Questo programma SAS crea, a partire dall’archivio studenti, un dataset ECXCEL permanente,
denominato “stud.xlsx”, nella directory "c:\users\naddeo\desktop".
Se invece si facesse seguire la descrizione del dataset studenti dalle istruzioni
proc export data=studenti
dbms=csv
outfile="c:\users\naddeo\desktop\stud";
run;
si otterrebbe il file permanente stud (sempre nella medesima directory) avente la forma
sesso,eta
m,23
f,19
m,18
m,22
f,25
f,26
Se, invece, si utilizzassero le seguenti istruzioni
proc export data=studenti
outfile="c:\users\naddeo\desktop\student"
dbms=dlm;
delimiter='&';
run;
si otterrebbe (sempre nella medesima directory) un file, denominato “student” avente la forma seguente
sesso&eta
m&23
f&19
m&18
m&22
f&25
f&26
13
Se si volesse sostituire il delimitatore “&” con uno spazio bianco sarebbe sufficiente far eseguire al
SAS le seguenti istruzioni
proc export data=studenti
outfile="c:\users\naddeo\desktop\student"
dbms=dlm
replace;
run;
dove si è omessa l’indicazione del carattere di delimitazione e dove l’opzione “replace” fa sì che il
SAS sovrascriva l’archivio precedentemente creato.
In questo caso il file “student” avrebbe la forma seguente
sesso eta
m 23
f 19
m 18
m 22
f 25
f 26
14
3.5 La Proc SORT
Questa procedura esegue l'ordinamento dei record di un data set a seconda delle determinazioni (valori
numerici o stringhe alfanumeriche) assunte una o più variabili. Tale ordinamento, in base al codice
ASCII, per defatlt è effettuato in modo non decrescente
La sintassi è la seguente
PROC SORT DATA=<nome_del_dataset> <opzioni>;
BY [descending] <variabile/variabili>
dove l'istruzione “BY” indica la variabile o le variabili da considerare per l’ordinamento. Questa
istruzione deve essere necessariamente specificata. Quando si considerano più variabili, l'ordinamento
viene fatto a partire dalla prima.
L’opzione [descending] è necessaria quando si desidera un ordinamento a partire dalla
determinazione più alta fino alla più bassa (ossia in ordine decrescente o, più correttamente, non
crescente). Questa istruzione va inserita prima del nome della variabile di cui si vuole l’ordinamento in
modo non crescente.
L’opzione più utilizzata fra tutte quelle previste assume la forma
OUT = <nome_del_data_set>
e viene usata per specificare il nome del data set di uscita. In assenza di tale istruzione, il data set
ordinato si sovrappone a quello originale (se non sono stati commessi errori)
Esempio 3.5.1
Il seguente data set SAS “american_data”,
american_data.sas7bdat
15
che si trova nella directory “c:\users\naddeo\desktop”, contiene i dati relativi a:
- la ditta di alcune aziende americane (variabile “ditta”)
- i debiti espressi in migliaia di dollari (variabile “debito”),
- l’identificativo associato a ciascun cliente (variabile “numero_conto”) e
- la città in cui opera l’azienda (variabile “citta”)
Si vogliono ordinare i record presenti nell’archivio a seconda delle determinazioni assunte dalla
variabile “citta” e, all’interno di questa, a seconda delle determinazioni assunte dalla “ditta”, seguendo
in entrambi i casi l’ordine non decrescente.
Il file creato, di tipo temporaneo, dovrà essere denominato “city_company” e andrà stampato a
terminale, con le seguenti due righe di titolo:
Clienti indebitati
elencati in ordine alfabetico all'interno di ciascuna città
Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: ditta, città, debito,
identificativo.
Un programma SAS che soddisfa queste richieste è il seguente
data origine;
set 'c:\users\naddeo\desktop\american_data.sas7bdat';
proc sort data=origine out=city_company;
by citta ditta;
proc print data=city_company;
var ditta citta debito ident;
title 'Clienti indebitati';
title2 'elencati in ordine alfabetico all''interno di ciascuna città';
run;
dove il dataset SAS viene letto utilizzando l’istruzione “set” seguita dal percorso e dal nome completo
del file.
L’output assume la forma
16
Clienti indebitati
elencati in ordine alfabetico all'interno di ciascuna città
Oss Ditta citta debito numero_conto
1 Apex Catering Apex 37.95 9923
2 Paul's Pizza Apex 83.00 1019
3 Peter's Auto Parts Apex 65.79 7288
4 Tina's Pet Shop Apex 37.95 5108
5 Watson Tabor Travel Apex 37.95 3131
6 Boyd & Sons Accounting Garner 312.49 4762
7 Deluxe Hardware Garner 467.12 8941
8 Elway Piano and Organ Garner 65.79 5217
9 World Wide Electronics Garner 119.95 1122
10 Ice Cream Delight Holly Springs 299.98 2310
11 Tim's Burger Stand Holly Springs 119.95 6335
12 Bob's Beds Morrisville 119.95 4998
13 Pauline's Antiques Morrisville 302.05 9112
14 Strickland Industries Morrisville 657.22 1675
Sulla base del medesimo dataset SAS si consideri ora un programma SAS che esegue l’ordinamento
dei record a seconda della variabile città (ordinata in senso crescente), del debito (in senso decrescente)
e dell’identificativo (in senso crescente).
Il file creato, di tipo permanente, dovrà comparire nella medesima directory del file originario ed essere
denominato “city_company1”. Dovrà stampato a terminale, con le seguenti due righe di titolo:
Clienti indebitati
elencati per città e valori decrescenti del debito
Le variabili dovranno inoltre comparire nell’ordine specificato qui di seguito: città, debito, ditta,
identificativo.
Un programma SAS che soddisfa queste richieste è il seguente
17
libname libreria 'c:\users\naddeo\desktop';
data origine;
set 'c:\users\naddeo\desktop\american_data.sas7bdat';
proc sort data=origine out=libreria.city_company1;
by citta descending debito ditta;
proc print;
var citta debito ditta numero_conto;
title 'Clienti indebitati';
title2 'elencati per città e valori decrescenti del debito';
run;
e il corrispondete output assume la forma
Clienti indebitati
elencati per città e valori decrescenti del debito
Oss citta debito ditta numero_conto
1 Apex 83.00 Paul's Pizza 1019
2 Apex 65.79 Peter's Auto Parts 7288
3 Apex 37.95 Apex Catering 9923
4 Apex 37.95 Tina's Pet Shop 5108
5 Apex 37.95 Watson Tabor Travel 3131
6 Garner 467.12 Deluxe Hardware 8941
7 Garner 312.49 Boyd & Sons Accounting 4762
8 Garner 119.95 World Wide Electronics 1122
9 Garner 65.79 Elway Piano and Organ 5217
10 Holly Springs 299.98 Ice Cream Delight 2310
11 Holly Springs 119.95 Tim's Burger Stand 6335
12 Morrisville 657.22 Strickland Industries 1675
13 Morrisville 302.05 Pauline's Antiques 9112
14 Morrisville 119.95 Bob's Beds 4998
18
3.6 Esercizi riepilogativi
Esercizio 3.6.1
Considerato il file excel “occup.xlsx” nella directory “c:\users\naddeo\desktop\” creare, nella medesima
directory, un data set SAS permanente di nome “occup_aosta” che contenga le sole osservazioni
relative alla Val d’Aosta e, per ciascun record, calcolare:
- il tasso di occupazione “tas_occ” (dato dal rapporto fra il numero di occupati e la popolazione di 15 o
più anni)
- il tasso di disoccupazione “tas_dis” (dato dal rapporto fra il numero di individui in cerca di
occupazione e le forze di lavoro)
- il tasso di attività “tas_att” (dato dal rapporto fra le forze di lavoro e la popolazione di 15 o più anni)
Stampare i soli risultati relativi alla denominazione e ai tre tassi.
Soluzione
Il programma SAS potrebbe assumere la forma
libname libr1 "c:\users\naddeo\desktop\";
proc import datafile="c:\users\naddeo\desktop\occup.xlsx" dbms=excel out=occup;
data libr1.occup_aosta; set occup;
if reg=2;
tas_occ = occupati/Popolazione_di_15_anni_o_pi_;
tas_dis = In_cerca_di_occupazione/Forze_di_lavoro;
tas_att = Forze_di_lavoro/Popolazione_di_15_anni_o_pi_;
proc print;
run;
e la stampa finale deve consistere nel seguente file
Oss Denominazione tas_occ tas_dis tas_att
1 AOSTA 0.49614 0.08474 0.54208
2 AYAS 0.51380 0.07401 0.55486
3 COURMAYEUR 0.54674 0.06363 0.58389
4 SAINT-VINCENT 0.48985 0.10040 0.54452
5 VALTOURNENCHE 0.54268 0.07898 0.58922
19
Esercizio 3.5.2
Il seguente data set SAS si riferisce a una classe di studenti inglesi su cui sono state rilevate le variabili
sesso (M = maschio, F = femmina), l’età, l’altezza in pollici e il peso in libbre.
Esprimere i dati relativi i dati relativi all’altezza in centimetri (tenendo presente che 1 pollice equivale a
2,54 cm.) ed i dati relativi al peso in chilogrammi (tenendo presente che 1 libbra equivale a circa
0,453592 kg.).
Esportare il file in formato delimitato (CSV file) in cui le colonne sono separate dal carattere “&”.
20
Soluzione proc export data=sashelp.class
outfile="c:\myfiles\class"
dbms=dlm;
delimiter='&';
run;
proc export data=sashelp.class
outfile="c:\myfiles\class"
dbms=csv;
if _n_ = 1 then do;
put "Nome" ' ' "Sesso" ' ' "Eta" ' ' "Altezza" ' ' "Peso";
end;
/*
29 format Name $8. ;
30 format Sex $1. ;
31 format Age best12. ;
32 format Height best12. ;
33 format Weight best12. ;
*/