Le forum du Master ESA économétrie et statistique appliquée - Université d'Orléans

Vous n'êtes pas identifié.

Annonce

Vous êtes sur le forum du master ESA !

Le site du master ESA - description de la formation, notes de cours, contacts... est ici :

http://www.univ-orleans.fr/deg/masters/ESA/

#1 14-01-2009 14:42:16

chiraz
Member
Date d'inscription: 18-12-2008
Messages: 104

comment faire pour préciser la position colonne et informat date

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

 

#2 14-01-2009 15:43:08

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5795
Site web

Re: comment faire pour préciser la position colonne et informat date

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 :

Code:

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

 

#3 14-01-2009 16:16:16

chiraz
Member
Date d'inscription: 18-12-2008
Messages: 104

Re: comment faire pour préciser la position colonne et informat date

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

 

#4 15-01-2009 15:09:39

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5795
Site web

Re: comment faire pour préciser la position colonne et informat date

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

 

#5 15-01-2009 23:20:35

jabdeltif
Member
Lieu: PARIS
Date d'inscription: 27-09-2008
Messages: 23

Re: comment faire pour préciser la position colonne et informat date

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

 

#6 16-01-2009 08:50:35

esa_sr
Administrator
Date d'inscription: 21-02-2007
Messages: 5795
Site web

Re: comment faire pour préciser la position colonne et informat date

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

 

Pied de page des forums

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson

[ Generated in 0.006 seconds, 8 queries executed ]