IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SAS Base Discussion :

Importer un .txt avec lignes de longueur variable


Sujet :

SAS Base

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 45
    Points : 43
    Points
    43
    Par défaut Importer un .txt avec lignes de longueur variable
    Bonjour,

    J'ai un fichier texte avec des lignes de longueur variable à importer sous SAS.
    J'ai une variable 'nbtrait' (nombre de traitement) et après j'ai sur 6 caractères un code pour chaque traitement. Mon nombre de traitement varie de 1 à n.

    Je voudrais automatiser l'import de ce fichier en créant une boucle après l'instruction input :

    Input @1 nbretrait 3; /*j'importe le nbre de traitement*/
    If nbretrait >0 then do;
    %do i=1 %to (nbretrait); @%eval(4+6*(&i-1) trait&i $6.; %end; /*si le nbre de traitements n'est pas nul, j'importe trait1, trait2,…,trait(nbretrait)*/
    End;

    Je ne sais pas comment indiquer que la fin de la boucle correspond au nombre de traitement (et donc dépend de chaque ligne et de la longueur de chaque ligne).

    Il y a d'autre solution pour importer le fichier, mais j'aimerais savoir si celle-ci est possible.

    Merci d'avance pour vos lumières.

  2. #2
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Sans avoir la solution à ton besoin
    Je peux déjà te dire où est le problème.
    Tu ne peux pas boucler sur une macro variable avec une information qui est importée dans l'étape data.

    En effet, il faut bien voir que sous SAS, tout se passe en 2 étapes (d'autres l'expliqueraient de façon plus précise que je le fais, mais c'est l'idée) :
    Etape 1 : tout le code macro variable est résolu, pour être tranformé en "vrai code SAS"
    Etape 2 : le code SAS est exécuté (étapes data et proc)

  3. #3
    Membre éclairé
    Homme Profil pro
    responsable adjoint service stat
    Inscrit en
    Mars 2009
    Messages
    448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : responsable adjoint service stat
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2009
    Messages : 448
    Points : 823
    Points
    823
    Par défaut
    Une solution, certainement pas optimale, mais qui a le mérite de marcher
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    %let nbmax_traitement = 3 ; 
     
    data test (drop = loop trait_all) ;
     
        infile "D:\DONNEES\T E M P\A_IMPORTER.txt"  missover ;
     
        length trait_all $%eval(6*&nbmax_traitement.) ;
        Input nbretrait 3  @4 trait_all $ ; 
     
        length trait1-trait&nbmax_traitement. $6 ;
        array traitn(&nbmax_traitement.) trait1-trait&nbmax_traitement. ;
     
        do loop = 1 to dim (traitn)  ;
            traitn(loop) = substr(trait_all, 1 + 6*(loop-1),6) ;
        end;  
     
    run ;
    Fichier txt testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    001AAAAAA
    001BBBBBB
    002CCCCCCDDDDDD
    000
    003EEEEEEFFFFFFGGGGGG

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 45
    Points : 43
    Points
    43
    Par défaut
    Bonjour et merci Rémi pour tes explications et ton aide. Je voudrais trouver une méthode ou je ne fixe pas à l'avance le nbre de max de traitement.

    Je vais essayer de procéder en 2 étapes data, une ou j'importe le fichier avec une variable 'traitement' de longueur 6*'nbretraitement', une autre ou je fais une boucle sur la longueur de la variable traitement...je vais voir si ça marche.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Bonjour,
    Pour optimiser ce travail il suffit de déterminer le nombre maximal de traitement et de le stocker dans une macro variable (&nbmax) comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    data _null_ ;
    infile "d:\donnees\t e m p\a_importer.txt" ;
    input nbtrait 3 ;	
    retain max_ ;
    max_=max(nbtrait, max_) ;
    call symputx('nbmax', max_) ;
    run;    %put  &nbmax ;
    Puis créer les variables traitement (Trait1-Trait&nbmax) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data test  ;
    infile "d:\donnees\t e m p\a_importer.txt"  truncover ;
    Input nbtrait 3 @4(Trait1-Trait&nbmax) ($6.);
    run;
    Cdt Ward

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 45
    Points : 43
    Points
    43
    Par défaut
    Voilà un code qui marche sans connaitre à priori le nbre max de traitement, mais qui ne me satisfait pas pleinement (pas du tout optimal en gestion du temps et de la mémoire)...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    %macro test();
    data trait ;
    	infile r3a truncover lrecl=32767 obs=1000;
    	input 
    	@1 nbretrait $2. 
    	@3 trait $594.; /*nbretrait est sur 2 caratctèes=> varie de 0 à 99 et le traitement est sur 6 caractères => longueur max théorique est de 594*/
    	temp=nbretrait+0; /*je convertis nbretrait en numérique*/
     
            /*je calcule le nbre max de traitement et le mets dans une macro variable*/
    	retain nbretrait 0;
    	if nbremax<temp then nbremax=temp;
    	call symput('traitmax',nbremax);
    run;
     
     
    data trait;
    set trait;
    	%do i=1 %to &traitmax;
    	trait&i=substr(trait,%eval(1+6*(&i.-1)),6);
    	%end;
    run;
    %mend;
    %import;

  7. #7
    Membre expérimenté
    Homme Profil pro
    Développeur en SAS/ Statisticien
    Inscrit en
    Janvier 2013
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur en SAS/ Statisticien
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2013
    Messages : 483
    Points : 1 552
    Points
    1 552
    Par défaut
    Je crois que tu n'as pas besoin d'une macro. Essayes ce code et tu auras 594/6=99 traitements. ... ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    data_null_ ;
    INFILE r3a truncover lrecl=32767 obs=1000;
    Input @1nbtrait $2. @3 trait $594.;	
    retain max_ ;
    max_=max(nbtrait, max_) ;
    call symputx('nbmax', max_) ;
    run;     %put  &nbmax ;		   
     
    DATA trait (drop=trait)  ;
    INFILE r3a truncover lrecl=32767 obs=1000;
    Input @1 nbtrait $2. @3 (Trait1-Trait&nbmax) ($6.);	
    run;
    Hoss

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    45
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 45
    Points : 43
    Points
    43
    Par défaut
    Merci hossward!

    nos messages se sont croisés tout à l'heure.
    Tes codes marchent très bien, je vais garder le premier.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Lire un fichier texte avec colonnes de longueur variable
    Par Jack_nicholson dans le forum SAS Base
    Réponses: 5
    Dernier message: 07/03/2011, 15h03
  2. [Débutant] importer un .txt avec plusieurs séparateurs
    Par Nuestracr dans le forum MATLAB
    Réponses: 20
    Dernier message: 23/10/2009, 14h37
  3. lecture de lignes de longueurs variables
    Par moon61 dans le forum C
    Réponses: 14
    Dernier message: 09/04/2009, 10h13
  4. import fichier Txt avec du SQL
    Par bouba_95 dans le forum Access
    Réponses: 1
    Dernier message: 19/01/2007, 21h44
  5. Pb import fichier txt avec lignes de longueurs diverses
    Par zebulon90 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 09/12/2004, 08h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo