Précédent   Forum des professionnels en informatique > Logiciels > Solutions d'entreprise > Business Intelligence > SAS > SAS Base
SAS Base Forum d'entraide sur SAS base : étape data, procédures non statistiques, procédures non graphiques, SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 14/12/2011, 01h04   #1
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Par défaut Gestion des erreurs dans une étape DATA

Bonsoir,

J'ai un programme de retraitement de chaines de caractères qui pour certaines observations va immanquablement créer des erreurs.
J'aimerais dans ce cas là que la variable sur laquelle s'est produite l'erreur ai une modalite "***ERREUR***" (pour "se souvenir" du lieu des erreurs voir créer un embranchement pour des traitements ad hoc que je définirais ensuite) pour cette observation, et par ailleurs que les erreurs spécifiques ne soient pas écrites dans la log (je souhaiterais faire une "interception" d'erreur en quelque sorte).

Pour être plus explicite voici un exemple :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
DATA TABLE;
 
Var='éèûâïËÂÃâ€';OUTPUT;
Var='éèûâÃ';OUTPUT;
Var='éèûâïËÂÔ';OUTPUT;
Var='éèûâ”';OUTPUT;
Var='';OUTPUT;
run;
 
DATA Table2; SET TABLE;
Reverse=input(Var,$utf8x350.);
Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
run;
Voici la log

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
1230
1231  DATA Table2; SET TABLE;
1232  Reverse=input(Var,$utf8x350.);
1233  Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
1234  run;
 
NOTE: Invalid argument TO FUNCTION INPUT at line 1233 COLUMN 10.
Var=éèûâà Reverse=Ã©Ã¨Ã»Ã¢Ý Reverse2=  _ERROR_=1 _N_=2
NOTE: Invalid argument TO FUNCTION INPUT at line 1233 COLUMN 10.
Var=éèûâïËÂÔ Reverse=éèûâïËÂÔ Reverse2=  _ERROR_=1 _N_=3
NOTE: Invalid argument TO FUNCTION INPUT at line 1232 COLUMN 9.
NOTE: Invalid argument TO FUNCTION INPUT at line 1233 COLUMN 16.
Var=éèûâ” Reverse=  Reverse2=  _ERROR_=1 _N_=4
NOTE: There were 5 observations READ FROM the DATA SET WORK.TABLE.
NOTE: The DATA SET WORK.TABLE2 has 5 observations AND 3 VARIABLES.
NOTE: DATA statement used (Total process time):
      real time           0.02 seconds
      cpu time            0.00 seconds
voici la table de sortie

Code :
1
2
3
4
5
6
7
8
 
                         Obs    Var                                    Reverse             Reverse2
 
                          1     éèûâïËÂÆ   éèûâïËÂÔ    éèûâïËÂÔ
                          2     éèûâà                     éèûâÝ
                          3     éèûâïËÂÔ                       éèûâïËÂÔ
                          4     éèûâ”
                          5
voici la table que j'aimerais avoir en sortie

Code :
1
2
3
4
5
6
7
8
 
                       Obs    Var                                    Reverse             Reverse2
 
                        1     éèûâïËÂÆ   éèûâïËÂÔ    éèûâïËÂÔ
                        2     éèûâà                     Ã©Ã¨Ã»Ã¢Ý           ***ERREUR***
                        3     éèûâïËÂÔ                       éèûâïËÂÔ            ***ERREUR***
                        4     éèûâ”                              ***ERREUR***        ***ERREUR***
                        5
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 14/12/2011, 07h45   #2
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Bonjour Jérôme.
Oui, on peut rattraper à la volée une erreur dans l'étape DATA.
Quand il y a un souci, SAS met à jour une variable interne de son vecteur de travail appelée _ERROR_. Par défaut, celle-ci vaut 0. Elle montre des signes d'énervement en prenant n'importe quelle valeur positive (qui dépend de l'erreur évidemment, mais je ne sais pas où se trouve le dictionnaire des valeurs).
Bref, tu la reconfigures à la volée car elle n'est pas protégée :
Code :
1
2
3
4
5
6
7
8
9
DATA Table2; SET TABLE;
Reverse=input(Var,$utf8x350.);
Reverse2=input(input(Var,$utf8x350.),$utf8x350.);
IF _error_>0 THEN DO ;
  Reverse ="***ERREUR***" ;
  Reverse2="***ERREUR***" ;
  _error_=0 ;
END ;
run;
... Peut-être que quelques vieux barbons comme moi auront une bouffée de nostalgie, ça vient de rappeler la programmation en CAML de mes 18 ans : on faisait des RAISE ERROR et des CATCH ensuite, je crois. En fait SAS c'est beaucoup plus cool que CAML comme langage, il y a plus de surprises.
Bonne journée et merci de cette petite piqûre nostalgique.

PS : c'est évidemment super dangereux de prendre l'habitude de planquer l'erreur sous le tapis. Il faudrait tester plus finement le code erreur, ou compliquer la condition (REVERSE2 est vide par exemple) pour ne pas enterrer tous les problèmes dans le même trou.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 15/12/2011, 00h19   #3
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Merci olivier, je vais tester ça.
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 09h26   #4
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Je viens de regarder plus en détails,

malheureusement l'erreur ne disparait pas totalement, car celle dans la fonction s'affiche toujours

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
 
proc fcmp outlib=sasuser.MyFuncs.ChrFuncs;
FUNCTION conv(string $) $200;
length conv $200;
conv=input(string,$utf8x200.);
RETURN (conv);
endsub;
run; 
 
options cmplib=sasuser.MyFuncs;
 
 
DATA a;
length var $100;
var='é';output;
var='éé';output;
var='éééé';output;
run;
 
DATA b; SET a;
length var1 $100;
var1=put(var,$utf8x100.);
var2=substr(var1,1,5);
var3=conv(var2);
IF _error_>0 then _error_=0;
run;
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
119  DATA b; SET a;
120  length var1 $100;
121  var1=put(var,$utf8x100.);
122  var2=substr(var1,1,5);
123  var3=conv(var2);
124  IF _error_>0 then _error_=0;
125  run;
 
 
ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTC' dans l'instruction numéro 2,
       ligne 6, colonne 1.
       L'instruction était :
    0      (6:1)     conv = INPUT( string="ééÃ
                  ", $UTF8X200.(969996900) )
ERROR: Exception occurred during subroutine call.
NOTE: There were 3 observations read from the data set WORK.A.
NOTE: The data set WORK.B has 3 observations and 4 variables.
NOTE: DATA statement used (Total process time):
      real time           0.41 seconds
      cpu time            0.23 seconds

Il s'agit donc de faire également la même interception d'erreur au niveau de la fonction, j'ai bricolé un peu le même code avec if _error_>0 then _error_=0 mais cela ne semble pas fonctionner dans la proc fcmp de la même façon que dans l'étape DATA
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 09h50   #5
Expert Confirmé
 
Avatar de olivier.decourt
 
Homme Olivier Decourt
Formateur en informatique
Inscription : avril 2008
Messages : 1 467
Détails du profil
Informations personnelles :
Nom : Homme Olivier Decourt
Âge : 34
Localisation : France

Informations professionnelles :
Activité : Formateur en informatique
Secteur : Conseil

Informations forums :
Inscription : avril 2008
Messages : 1 467
Points : 2 828
Points : 2 828
Je ne sais pas si on peut facilement manipuler _error_ dans la fonction, car il y a un risque que ça soit une variable locale par défaut.
Il faudrait mettre _error_ en paramètre "update" de la fonction, ou quelque chose de ce genre ; rien de simple en somme.
olivier.decourt est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/01/2012, 09h59   #6
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Bonjour Olivier et merci,
parce qu'en fait cette erreur se produit des centaines de milliers de fois et gonfle un ficher .txt où je stocke la log de cette étape.
Et SAS prend beaucoup, beaucoup de temps à écrire dans cette log.

Je cherche à ce qu'il y a plus aucune impression en log concernant cette étape alors si il n'y a pas moyen faire autrement, car les fichier log.txt de plusieurs Go ça sert à rien et ça ralenti....

Je suis obligé de passer par ceci http://sas.developpez.com/faq/sas/?page=1.3#101 ?
Cela permet bien de lancer quelque chose sans rien écrire dans la log ou quelque part d'autre (et donc sans perdre le temps en conséquence...) ?
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/01/2012, 07h30   #7
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Vu que la solution http://sas.developpez.com/faq/sas/?page=1.3#101 ne semble pas marcher non plus,

Finalement j'ai donc ajouté un test dans la fonction pour limiter sérieusement le cas des données invalides (je n'évalue la fonction que sur les données qui ont une chance d'être réellement modifiées par la fonctions, celles qui ne seront de toute façon modifiées et qui produisent des erreurs en nombre je ne les soumet plus, ça permet par la même occasion une petite optimisation du code) ce qui réduit drastiquement la taille du fichier log.txt à quelques dizaines de Mo limitant ainsi la perte de temps en écriture dans la log.

Mais je demeure intéressé par une solution au problème de l'interception/gestion des erreurs dans les fonctions créées via fcmp
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/01/2012, 09h52   #8
Invité de passage
 
Inscription : décembre 2008
Messages : 1
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 1
Points : 3
Points : 3
As-tu essayé avec le caractère ? devant le format ?
Cela évite l'affichage des erreurs mais continue d'alimenter la variable _error_.

Code :
1
2
3
4
5
6
7
8
9
DATA Table3; SET TABLE;
 Reverse=input(Var,?$utf8x350.);
 Reverse2=input(input(Var,?$utf8x350.),?$utf8x350.);
 IF _error_>0 THEN DO ;
   Reverse ="***ERREUR***" ;
   Reverse2="***ERREUR***" ;
   _error_=0 ;
 END ;
 run;
eblanchet est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 22/01/2012, 22h59   #9
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
Bonjour,

oui j'ai essayé le ? devant comme tu le propose mais les erreurs demeurent
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/01/2012, 15h40   #10
Membre Expert
 
Inscription : mars 2005
Messages : 1 011
Détails du profil
Informations forums :
Inscription : mars 2005
Messages : 1 011
Points : 1 259
Points : 1 259
Envoyer un message via Yahoo à bahraoui
Il manque un espace entre le caractère '?' et le nom du format.
__________________
Consultez les FAQs et les anciens postes avant de poser vos questions. Merci
bahraoui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 18h04   #11
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
J'étais passé à d'autres travaux en attendant, je regarde dans la semaine sur ce point précis.

Merci.
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 23h12   #12
Modérateur
 
Homme Samir SELMANE
Consultant en Business Intelligence
Inscription : février 2011
Messages : 1 012
Détails du profil
Informations personnelles :
Nom : Homme Samir SELMANE
Localisation : France

Informations professionnelles :
Activité : Consultant en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : février 2011
Messages : 1 012
Points : 1 717
Points : 1 717
Je ne crois pas que c'est du à l'espace non laissé entre ?? et l'informat.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
 
 
DATA dte;
input var $10.;
cards;
12/03/2011
11/09/2010
30/06/2000
11/09/2010
31/06/2000
00/09/2010
30/06/2000
32/09/2010
30/00/2000
11/09/2010
30/06/2000
;run;
 
DATA dte_1;
SET  dte;
var1= input (var,??ddmmyy10.);
run;
 
DATA dte_2;
SET  dte;
var1= input (var,?? ddmmyy10.);
run;
 
DATA dte_3;
SET  dte;
var1= input (var,?ddmmyy10.);
run;
 
DATA dte_4;
SET  dte;
var1= input (var,? ddmmyy10.);
run;
 
proc sql;
CREATE TABLE dte_5 AS SELECT input (var,?? ddmmyy10.) FROM dte;
quit;
 
 
proc sql;
CREATE TABLE dte_6 AS SELECT input (var,??ddmmyy10.) FROM dte;
quit;
 
 
proc sql;
CREATE TABLE dte_7 AS SELECT input (var,?ddmmyy10.) FROM dte;
quit;
 
 
proc sql;
CREATE TABLE dte_8 AS SELECT input (var,? ddmmyy10.) FROM dte;
quit;
Je dirai plutôt :
pour n'imprimer que 1 seul MSG d erreur de chaque type d'erreur.
Exemple:
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
 
DATA dte;
input var $10.;
cards;
12/03/2011
11/09/2010
30/06/2000
11/09/2010
31/06/2000
00/09/2010
30/06/2000
32/09/2010
30/00/2000
11/09/2010
30/06/2000
;run;
OPTION error=1;
DATA dte_1;
SET  dte;
var1= input (var,ddmmyy10.);
run;
 
OPTION error=200;
DATA dte_2;
SET  dte;
var1= input (var, ddmmyy10.);
run;
on voit bien que dans la première étape data SAS n'a imprimé qu'un seul message erreur de même type d'erreur. et dans la deuxième étape Data j'ai demandé d'imprimer jusqu'à 200 message du même type d erreur.
j'espère que sa pourra t'aider.
s_a_m est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 01/02/2012, 23h50   #13
Membre éclairé
 
Homme
statisticien
Inscription : mai 2011
Messages : 213
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : statisticien
Secteur : Administration - Collectivité locale

Informations forums :
Inscription : mai 2011
Messages : 213
Points : 319
Points : 319
oui oui, mais c'est toujours la même histoire, ça limite les erreurs de l'étape data, mais pas celles de la fonction, et c'est celles ci qui me posent problème et que je n'arrive pas à supprimer.


Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
 
 
proc fcmp outlib=sasuser.MyFuncs.ChrFuncs;
FUNCTION fonc(var$);
RETURN (input(var,ddmmyy10.));
endsub;
run;
options cmplib=sasuser.MyFuncs;
 
 
OPTION error=1;
DATA dte_3;
SET  dte;
var1= fonc(var);
run;

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
 
131
132  OPTION error=1;
133  DATA dte_3;
134  SET  dte;
135  var1= fonc(var);
136  run;
 
 
ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
       ligne 5, colonne 1.
       L'instruction était :
    0      (5:1)     _fonc_ = INPUT( var="31/06/2000", DDMMYY10.(105088000) )
ERROR: Une exception s'est produite durant l'appel du sous-programme.
WARNING: La limite définie par l'OPTION ERRORS= a été atteinte.  Les prochaines erreurs de ce type ne s'afficheront pas.
var=31/06/2000 var1=. _ERROR_=1 _N_=5
 
ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
       ligne 5, colonne 1.
       L'instruction était :
    0      (5:1)     _fonc_ = INPUT( var="00/09/2010", DDMMYY10.(105088000) )
ERROR: Une exception s'est produite durant l'appel du sous-programme.
 
ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
       ligne 5, colonne 1.
       L'instruction était :
    0      (5:1)     _fonc_ = INPUT( var="32/09/2010", DDMMYY10.(105088000) )
ERROR: Une exception s'est produite durant l'appel du sous-programme.
 
ERROR: Un argument interdit est utilisé dans l'appel de la fonction dans la fonction 'INPUTN' dans l'instruction numéro 2,
       ligne 5, colonne 1.
       L'instruction était :
    0      (5:1)     _fonc_ = INPUT( var="30/00/2000", DDMMYY10.(105088000) )
ERROR: Une exception s'est produite durant l'appel du sous-programme.
NOTE:  11 observation(s) lue(s) dans la TABLE WORK.DTE.
NOTE: La TABLE WORK.DTE_3 a 11 observation(s) et 2 variable(s).
NOTE: L'étape DATA a utilisé (Durée totale du traitement) :
      temps réel          0.33 secondes
      temps UC            0.09 secondes
Quand aux ? ou ?? devant l'informat , blanc ou pas blanc, ça créé une erreur de compilation.


En fait le titre est trompeur, ce fil est trop ancien je pense pour en changer le titre, mais "Gestion des erreurs dans la proc fcmp" serait plus indiqué.

Enfin à présent c'est juste pour savoir, vu que finalement j'ai préfèré mettre le code en macro %fonc plutot que dans une fonction , ce qui a l'avantage de faire des erreurs dans l'étape DATA...dont on peu limiter le nombre comme vous me l'avez indiqué.
jerome_pdv2 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h43.


 
 
 
 
Partenaires

Hébergement Web