Vous n'êtes pas identifié.
Vous êtes sur le forum du master ESA !
Le site du master ESA - description de la formation, notes de cours, contacts... vient de déménager !!!
Venez visiter notre nouveau site : www.master-esa.fr
Pages: 1
Bonjour,
J'ai un petit souci avec la variable DEPARTDATE qui est de la forme 12JAN2000 et qui est entre la colonne 51 et la colonne 52.
J'arrive à la déclarer comme alphanumérique et indiquer la position mais dès que je change l'informat en "date9." Sas m'idique:
153 DEPARTDATE date9. 51-52
--
22
ERREUR 22-322: requis.un nom.
voici le programme en question
data ucl.exo1;
infile 'C:\Users\fichier';
input FLIGHTID $ 1-17
ROUTEID $ 8-14
DESTINATION $ 18-20
MODEL $21-40
DEPARDAY $ 41-49
DEPARTDATE date9. 51-52 /*comment transformer en format date9. et en mm temps indiquer la position*/
FCLASSPASS 53-55
BCLASSPASS 57-59
ECLASSPASS 61-63
TOTPASSCAP 65-67 ;
run;
voici une ligne du fichier
IA112000000112SFOHNDJetCruise LF8100 01DEC1999 4 19 31 171 255 61300 79077
Comment faire pour mettre cette variable en format date.
merci d'avance.
Dernière modification par chiraz (14-01-2009 14:43:14)
Hors ligne
Bonjour
Dans votre ligne INPUT, il y a plein de choses problématiques
input FLIGHTID $ 1-17
ROUTEID $ 8-14
DESTINATION $ 18-20 ...
lorsque vous arrivez dans la ligne de données, vous allez regarder entre les colonnes 1 et 17 pour enregistrer FLIGHTID - vous demandez ensuite de lire entre les colonnes 8 et 14 et donc de revenir en arrière : c'est étrange et cela peut être risqué (impossible par exemple quand vous avez appliqué un INFORMAT comme date9. qui n'autorise pas ensuite les indications de positionnement colx-coly).
Il st généralement recommandé, si vous souhaitez revenir en arrière, de le demander (gentiment) au moyen des instructions @x qui indique à SAS, rends toi maintenant en xème colonne pour enregistrer la variable suivante.
votre instruction INPUT devient alors :
input FLIGHTID $ 1-17
@8 ROUTEID $ 8-14
DESTINATION $ 18-20 ...
pour votre date, vous souhaitez en fait enregistrer deux fois la même donnée (01DEC1999)
... DEPARDAY $ 41-49
@41 DEPARTDATE date9.
préciser ensuite un emplacement (51-52) n'a aucun sens parce que :
1- avec date9., vous indiquez déjà à SAS de lire neuf caractères
2- comment pourrait faire SAS pour trouver neuf caractères dans deux colonnes ?
3- cette manoeuvre n'est en fait même pas possible puisque SAS n'autorise pas, après votre INFORMAT, des informations indiquant dans quelle colonne lire. Après le DATE9., SAS attend un nom de variable (c'est en fait ce que le "requis.un nom" signifie :
1310 DEPARTDATE date9. 41-49 -- 22 ERREUR 22-322: requis.un nom.
(il faut relire le chapitre 2 de mon bouquin ;-))
cordialement
SR
Hors ligne
Merci,
Pour la variable FLIGHTID, effectivement c'est une faute de frappe, c'est 1-7.Mais bizarement SAS a bien enregistrée la variable ROUTEID $ 8-14 en prenant des valeurs entre la 8ème et la 14 ème colonne sans rien me signaler.
pour la variable depardate ( une deuxième faute ) c'est bien entre 41 ème colonne et la 49 ème et j'ai fait comme vous avez dit en indiquant @41 avant le nom de la variable mais en indiquant 41-49 après cela ne marche pas.
l'input devient:
input FLIGHTID $ 1-7
ROUTEID $ 8-14
origin $ 15-17
DESTINATION $ 18-20
MODEL $21-40
@41 DEPARTDATE date9.
@51 DEPARDAY
FCLASSPASS 53-55
BCLASSPASS 57-59
ECLASSPASS 61-63
TOTPASSCAP 65-67
cargowt 69-73
cargorev 75-79;
run;
Ceci dit à vos ordre chef je vais relire le 2ème chapitre du livre.
Cordialement
Dernière modification par chiraz (14-01-2009 16:19:20)
Hors ligne
chiraz a écrit:
pour la variable depardate ( une deuxième faute ) c'est bien entre 41 ème colonne et la 49 ème et j'ai fait comme vous avez dit en indiquant @41 avant le nom de la variable mais en indiquant 41-49 après cela ne marche pas.
simplement parce que SAS n'autorise pas l'indication de colonnes à lire (colx-coly) après un INFORMAT date9.
Pour SAS, après date9., il ne peut venir que le nom de la variable suivante.
(ce n'est pas idiot : si vous indiquez date9., vous indiquez que 9 colonnes sont à lire - pourquoi ensuite préciser l'emplacement de ces neuf colonnes).
Ceci dit, vous soulevez un point très intéressant : la possibilité de revenir en arrière dans une ligne de données sans pour autant faire appel à @x (qui est l'approche standard généralement préconisée parce que plus sûre).
Intuitivement, je pense que (mais il faudrait que je vérifie) :
- pour les variables appelées à devenir alphanumériques : pas de problème pour revenir en arrière dans l'enregistrement au moyen d'instruction colx-coly (il faut quand même que je vérifie ce qui se passe dans un INFORMAT $w. est précisé - il faut aussi voir ce qui se passe en cas d'INFORMAT :$w)
- pour les variables appelées à devenir numériques, deux cas sont possibles :
* soit vous n'indiquez aucun INFORMAT particulier et vous pouvez revenir en arrière dans la ligne de données sans @x
* soit vous avez indiqué un INFORMAT numérique et (cela demande vérification) quel que soit l'INFORMAT, (même si c'est un :INFORMAT.), pour revenir en arrière dans l'enregistrement, vous devrez utiliser @x
je vais réfléchir...
Hors ligne
Bonjour,
Si j'ai bien compris votre problème (je m'en doute parce que j'ai pas compris ce que vous voulez transformer en format date9. je veux dire ce qui est dans colonne 51-52) le programme suivant pourra marcher!
input FLIGHTID $ 1-7
ROUTEID $ 8-14
origin $ 15-17
DESTINATION $ 18-20
MODEL $21-40
DEPARDAY $ 41-49
DEPARTDATE 51-52
FCLASSPASS 53-55
BCLASSPASS 57-59
ECLASSPASS 61-63
TOTPASSCAP 65-67
cargowt 69-73
cargorev 75-79;
format DEPARTDATE ddmmyy9.; /*indiquer le format de date que vous souhaitez*/
run;
Cordialement
A.J
Hors ligne
format DEPARTDATE ddmmyy9.; ???
non non non !!
en colonne 51-52, vous avez en modalité '4'. si vous imposez ensuite le FORMAT DDMMYY9. à votre variable DEPARTDATE (de modalité 4),
qu'allez-vous obtenir ?
à l'écran, la date qui correspond à 4 pour SAS, soit le 5 janvier 1960 (puisqu'une date, c'est un nombre de jours qui sépare la date en question du 1er janvier 1960).
vous me direz ensuite : "c'est une erreur, en fait, je voulais imposer le FORMAT à la variable DEPARDAY qui, en raison de votre commande INPUT est alphanumérique et de modalité '01DEC1999'.
Ça ne marchera pas non plus : vous ne pouvez pas imposer un FORMAT numérique à une variable alphanumérique.
Par contre, si vous avez enregistré votre date dans une variable alphanumérique, il est toujours possible d'utiliser la fonction INPUT :
newdate=input(deparday,ddmmyy10.) ;
format newdate ddmmyy10. ;
cela fonctionnera ici puisque newdate est une variable numérique (le format cité dans la fonction INPUT est numérique)
Hors ligne
Pages: 1