L'importation de fichiers CSV vers l'environnement SAS Viya est une opération qui dépasse le simple transfert de données ; c'est une étape cruciale de typage et de structuration. L'action upload du moteur CAS se distingue par sa capacité à transformer des chaînes de caractères brutes en données analytiques riches dès le chargement. L'utilisation du paramètre importOptions, et plus spécifiquement du sous-paramètre vars, permet de définir des informats (pour la lecture) et des formats (pour l'affichage) de manière granulaire.
C'est particulièrement vital pour les dates : en appliquant l'informat mmddyy10., vous convertissez une date texte comme "07/03/2013" en une valeur numérique SAS standard. L'application simultanée du format nldate20. garantit que cette donnée sera restituée de façon lisible et localisée dans vos rapports, tout en restant parfaitement calculable pour des agrégations temporelles.
Type : CREATION_INTERNE
Les exemples utilisent des données CSV générées directement dans le code SAS via un DATA _NULL_ step, simulant la disponibilité d'un fichier CSV local.
| 1 | /* Création du fichier CSV local */ |
| 2 | DATA _NULL_; |
| 3 | FILE "/tmp/myusage_basic.csv" DSD LRECL=200; |
| 4 | PUT 'account,high,low,recorddt,startdt,enddt,kwh'; |
| 5 | PUT '1000001,82,71,07/03/2013,07/01/2013,07/02/2013,54'; |
| 6 | PUT '1000001,85,70,07/02/2013,06/30/2013,07/01/2013,70'; |
| 7 | PUT '1000001,85,68,07/01/2013,06/29/2013,06/30/2013,78'; |
| 8 | RUN; |
| 9 | |
| 10 | /* Connexion au serveur CAS (remplacer par vos infos) */ |
| 11 | *options cashost='cloud.example.com' casport=5570; |
| 12 | cas casauto; |
| 13 | |
| 14 | PROC CAS; |
| 15 | SESSION casauto; |
| 16 | upload path="/tmp/myusage_basic.csv" |
| 17 | casout={name="myusage_basic", replace=True}, |
| 18 | importOptions={ |
| 19 | fileType="csv", |
| 20 | getNames=True, |
| 21 | vars={ |
| 22 | recorddt={informat="mmddyy10.", FORMAT="nldate20."}, |
| 23 | startdt={informat="mmddyy10.", FORMAT="nldate20."}, |
| 24 | enddt={informat="mmddyy10.", FORMAT="nldate20."} |
| 25 | }}; |
| 26 | |
| 27 | PRINT myusage_basic(obs=3); |
| 28 | RUN; |
| 29 | QUIT; |
| 30 | |
| 31 | /* Suppression du fichier CSV temporaire */ |
| 32 | x "rm /tmp/myusage_basic.csv"; |
| 1 | /* Création du fichier CSV local avec plus de données */ |
| 2 | DATA _NULL_; |
| 3 | FILE "/tmp/myusage_inter.csv" DSD LRECL=200; |
| 4 | PUT 'account,high,low,recorddt,startdt,enddt,kwh,cost'; |
| 5 | PUT '1000001,82,71,07/03/2013,07/01/2013,07/02/2013,54,12.50'; |
| 6 | PUT '1000001,85,70,07/02/2013,06/30/2013,07/01/2013,70,15.75'; |
| 7 | PUT '1000002,85,68,07/01/2013,06/29/2013,06/30/2013,78,20.00'; |
| 8 | PUT '1000002,90,70,06/30/2013,06/28/2013,06/29/2013,72,18.25'; |
| 9 | PUT '1000003,88,68,06/29/2013,06/27/2013,06/28/2013,54,10.00'; |
| 10 | RUN; |
| 11 | |
| 12 | /* Connexion au serveur CAS (remplacer par vos infos) */ |
| 13 | *options cashost='cloud.example.com' casport=5570; |
| 14 | cas casauto; |
| 15 | |
| 16 | PROC CAS; |
| 17 | SESSION casauto; |
| 18 | upload path="/tmp/myusage_inter.csv" |
| 19 | casout={name="myusage_inter", replace=True, promote=True}, |
| 20 | importOptions={ |
| 21 | fileType="csv", |
| 22 | getNames=True, |
| 23 | vars={ |
| 24 | recorddt={informat="mmddyy10.", FORMAT="nldate20."}, |
| 25 | startdt={informat="mmddyy10.", FORMAT="nldate20."}, |
| 26 | enddt={informat="mmddyy10.", FORMAT="nldate20."}, |
| 27 | cost={informat="comma8.2", FORMAT="dollar10.2"} |
| 28 | }}; |
| 29 | |
| 30 | TABLE.columnInfo RESULT=r / TABLE={name='myusage_inter'}; |
| 31 | PRINT r; |
| 32 | |
| 33 | PRINT myusage_inter; |
| 34 | RUN; |
| 35 | QUIT; |
| 36 | |
| 37 | /* Suppression du fichier CSV temporaire */ |
| 38 | x "rm /tmp/myusage_inter.csv"; |
| 1 | /* Création du fichier CSV local */ |
| 2 | %LET CSV_FILE = /tmp/mydata_advanced_&sysdate._%sysfunc(compress(&systime.)).csv; |
| 3 | %LET CAS_TABLE = mydata_advanced; |
| 4 | %LET CAS_LIB = CASUSER; |
| 5 | |
| 6 | DATA _NULL_; |
| 7 | FILE "&CSV_FILE" DSD LRECL=200; |
| 8 | PUT 'ID,Category,Value,EntryDate'; |
| 9 | PUT '1,A,123.45,12-JAN-2023'; |
| 10 | PUT '2,B,678.90,01-FEB-2023'; |
| 11 | PUT '3,A,111.22,03-MAR-2023'; |
| 12 | PUT '4,C,333.33,15-APR-2023'; |
| 13 | RUN; |
| 14 | |
| 15 | /* Connexion au serveur CAS (remplacer par vos infos) */ |
| 16 | *options cashost='cloud.example.com' casport=5570; |
| 17 | cas casauto; |
| 18 | |
| 19 | PROC CAS; |
| 20 | SESSION casauto; |
| 21 | /* Vérifier si la table existe déjà et la supprimer si nécessaire */ |
| 22 | IF TABLE.tableInfo(caslib="&CAS_LIB", name="&CAS_TABLE") THEN DO; |
| 23 | TABLE.dropTable caslib="&CAS_LIB" name="&CAS_TABLE"; |
| 24 | END; |
| 25 | |
| 26 | upload path="&CSV_FILE" |
| 27 | casout={name="&CAS_TABLE", caslib="&CAS_LIB", replace=True, promote=True}, |
| 28 | importOptions={ |
| 29 | fileType="csv", |
| 30 | getNames=True, |
| 31 | vars={ |
| 32 | EntryDate={informat="date9.", FORMAT="nldate20."}, |
| 33 | Value={informat="comma10.2", FORMAT="dollar10.2"} |
| 34 | }}; |
| 35 | |
| 36 | PRINT &CAS_TABLE; |
| 37 | RUN; |
| 38 | QUIT; |
| 39 | |
| 40 | /* Supprimer le fichier CSV temporaire après utilisation */ |
| 41 | x "rm &CSV_FILE"; |
| 1 | /* Création du fichier CSV local */ |
| 2 | DATA _NULL_; |
| 3 | FILE "/tmp/transactions.csv" DSD LRECL=200; |
| 4 | PUT 'TransactionID,CustomerID,Amount,TransactionDate,ProductCode'; |
| 5 | PUT '1,C001,150.75,2023-01-15,PROD001'; |
| 6 | PUT '2,C002,230.00,2023-01-16,PROD002'; |
| 7 | PUT '3,C001,50.25,2023-01-15,PROD003'; |
| 8 | PUT '4,C003,100.00,2023-01-17,PROD001'; |
| 9 | PUT '5,C002,75.50,2023-01-16,PROD004'; |
| 10 | RUN; |
| 11 | |
| 12 | /* Connexion au serveur CAS (remplacer par vos infos) */ |
| 13 | *options cashost='cloud.example.com' casport=5570; |
| 14 | cas casauto; |
| 15 | |
| 16 | PROC CAS; |
| 17 | SESSION casauto; |
| 18 | caslib _all_ assign; |
| 19 | |
| 20 | /* 1. Charger le fichier CSV */ |
| 21 | upload path="/tmp/transactions.csv" |
| 22 | casout={name="raw_transactions", replace=True, promote=True}, |
| 23 | importOptions={ |
| 24 | fileType="csv", |
| 25 | getNames=True, |
| 26 | vars={ |
| 27 | TransactionDate={informat="yymmdd10.", FORMAT="nldate20."}, |
| 28 | Amount={informat="comma10.2", FORMAT="dollar10.2"} |
| 29 | }}; |
| 30 | |
| 31 | /* 2. Effectuer une agrégation avec FedSQL sur la table CAS */ |
| 32 | fedsql.execDirect RESULT=res / query=" |
| 33 | CREATE TABLE aggregated_transactions AS |
| 34 | SELECT |
| 35 | CustomerID, |
| 36 | COUNT(TransactionID) AS TotalTransactions, |
| 37 | SUM(Amount) AS TotalAmountSpent |
| 38 | FROM raw_transactions |
| 39 | GROUP BY CustomerID |
| 40 | ORDER BY TotalAmountSpent DESC; |
| 41 | "; |
| 42 | PRINT res; |
| 43 | |
| 44 | /* 3. Sauvegarder la table agrégée dans une caslib (ex: CASUSER) */ |
| 45 | TABLE.save RESULT=saveres / |
| 46 | TABLE={name="aggregated_transactions", caslib="CASUSER"}, |
| 47 | name="aggregated_transactions.sashdat", |
| 48 | replace=True; |
| 49 | PRINT saveres; |
| 50 | |
| 51 | /* 4. Afficher les résultats agrégés */ |
| 52 | PRINT aggregated_transactions; |
| 53 | RUN; |
| 54 | QUIT; |
| 55 | |
| 56 | x "rm /tmp/transactions.csv"; |