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 :

Import fichier csv sous SAS : champs avec retour à la ligne


Sujet :

SAS Base

  1. #1
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant SAS - Datamining
    Inscrit en
    juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant SAS - Datamining
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Import fichier csv sous SAS : champs avec retour à la ligne
    Bonjour,

    Je cherche à importer un fichier csv sous SAS.
    Dans ce fichier j'ai un champs texte qui peut contenir des retours à la ligne.

    Lorsque je fais l'import sous SAS, avec un infile :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    infile "C:\Fichiers\RequestFieldInfo.csv" delimiter = ';' MISSOVER DSD lrecl=32767 firstobs=2 TERMSTR=CRLF encoding=utf8;
    Cela ne fonctionne pas, car il interprete les retours à la ligne du champs message comme des nouvelles lignes à importer dans la table SAS.
    (Cela me parait assez logique d'ailleurs!).

    Mais lorsque j'ouvre mon fichier csv avec excel , il importe bien les données correctement avec le champs message complet dans une seule variable (colonne d'excel).

    Par ailleurs, lorsque je fais l'import sous SEG, cela fonctionne correctement également. Mais si je regarde le code généré par SEG correspondant, je m'aperçois qu'il importe un fichier txt, qu'il a lui même créé à partir de mon fichier csv.
    Donc l'infile devient :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        INFILE 'C:\Users\nom\AppData\Local\Temp\SEG4492\RequestFieldInfo-1be9c7fc432f4e26a60cfe5460ec289b.txt'
            LRECL=2834
            ENCODING="WLATIN1"
            TERMSTR=CRLF
            DLM='7F'x
            MISSOVER
            DSD ;
    Mais rien dans le code n'apparait au sujet de la création de ce fichier txt.
    Quand je regarde le fichier txt créé, je vois qu'il a supprimé les retours à la ligne et donc mis le champs message sur une même ligne.

    Mes questions sont donc :
    - savez vous quelle manip SEG fait exactement lors de cet import ? y a-t-il moyen de récupérer un code SAS pour cette manip ?
    - plus généralement, avez vous une idée pour résoudre mon problème (sans passer par SEG ! et de manière à tout faire via un programme SAS) ?

    Merci de votre aide !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Statisticien/développeur BI
    Inscrit en
    janvier 2012
    Messages
    325
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Statisticien/développeur BI
    Secteur : Transports

    Informations forums :
    Inscription : janvier 2012
    Messages : 325
    Points : 1 138
    Points
    1 138
    Par défaut
    Bonjour,

    Pouvez vous nous fournir quelques lignes en exemple du fichier à importer.

  3. #3
    Membre éclairé

    Femme Profil pro
    SAS FRANCE - Support Clients France et Europe
    Inscrit en
    février 2010
    Messages
    289
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : SAS FRANCE - Support Clients France et Europe
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : février 2010
    Messages : 289
    Points : 886
    Points
    886
    Par défaut
    Bonjour,

    Une astuce consiste à lire le fichier CSV, en considérant qu'1 observation est 1 seule variable, puis le "nettoyer" afin de re-créer un nouveau CSV qui ne contiendra pas ce caractère.

    Code à tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    data _null_;
      infile 'c:\temp\aa.csv' recfm=n ; 
      file  'c:\temp\aa_out.csv' recfm=n;
      input c $char1.;       
      if c = '0d'x then put '0d0a'x;
      else if c = '0a'x then;
      else put c $char1.;
    run;

    On ne peut pas récupérer le code d'Enterprise Guide pour créer ce txt, car Enterprise Guide utilise des technologies Microsoft pour certaines actions (comme l'export excel par exemple). La création du txt n'est pas donc forcément réalisée en code SAS/Base.

    Géraldine Cade
    Support Clients SAS
    Cordialement,

    --
    Géraldine CADE-DESCHAMPS
    Consultante ▪ Support Clients SAS
    Tel: +33 1 60 62 12 12 ▪ support@sas.com
    www.sas.com/france
    SAS® … THE POWER TO KNOW®

  4. #4
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant SAS - Datamining
    Inscrit en
    juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant SAS - Datamining
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci pour votre réponse.

    Cela ne fonctionne pas car en fait les retours à la ligne qui sont dans mon champs texte et ceux qui correspondent à la fin des enregistrements sont codés de la même façon : si je fais la conversion en code hexa je trouve
    0D 0A
    dans les 2 cas.

    En revanche, mes champs texte sont encadrés par des guillemets donc je vais essayer d'utiliser la technique que vous proposez (lecture caractère par caractère du fichier) pour distinguer les retours à la ligne à l'intérieur de mon champs texte , de ceux qui correspondent à la fin des enregistrements.

    Si vous avez des suggestions ou ... un code tout prêt qui fait ça !! (on peut rêver un peu !!), n'hésitez pas !

  5. #5
    Nouveau Candidat au Club
    Femme Profil pro
    Consultant SAS - Datamining
    Inscrit en
    juin 2012
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant SAS - Datamining
    Secteur : Conseil

    Informations forums :
    Inscription : juin 2012
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Voila le code que je vais finalement utiliser :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    DATA _null_;
      INFILE 'P:\test.csv' recfm=n ; 
      file  'P:\test_out.csv' recfm=n;
      input c $char1.;       
      retain cpt_pv 0 bl_glmt 0 ;
     
    /* cpt_pv = compteur de points virgule : incrémenté de 1 à chaque "rencontre" de points virgule sauf si  à l'intérieur d'un champ entre guillemets, donc si bl_glmt = 1 */
    /* bl_glmt = booleen guillemet : initialisé à 0, change de valeur entre 1 et 0 à chaque "rencontre" de guillemet*/
     
     
    IF c = '22'x then do; /* si le caractère est un guillemet => on change la valeur du booleen guillemet entre 1 et 0 */
    	if bl_glmt = 1 then bl_glmt = 0 ;
    	else if bl_glmt = 0 then bl_glmt = 1 ;
    end;
     
     
    if bl_glmt = 1 and cpt_pv in (5,6,7) then do; /* si on est  à l'intérieur du champ 5, 6 ou 7 (guillemet ouvert et après 5, 6 ou 7ème point virgule) */
     
    	if c = '22'x then put c $char1.; /* on conserve uniquement les guillemets dans le nouveau fichier csv */
     
    end;
    else do ; /* pour tous les autres cas */
     
    	put c $char1.; /* on conserve le caractère dans le nouveau fichier csv */
    	if c = '3b'x then do; /* si le caractère est un point virgule => on incrémente le compteur de point virgule */
    		cpt_pv = cpt_pv + 1 ;
    	end;
     
    end;
     
    if cpt_pv = 20 then cpt_pv = 0; /* lorsqu'on arrive au 20eme point virgule (dernier champ), on remet le compteur de point virgule à 0 */
     
     
    run;
    J'ai 20 champs à lire par enregistrement, et 3 champs à nettoyer (les 5, 6 et 7eme) => ils peuvent contenir des retours à la ligne, ou des points virgule, et sont par contre entourés de guillemets (sachant que les éventuels guillemets situés à l'intérieur de ces champs sont doublés : 2 guillemets au lieu d'1 à chaque fois).

    Donc je pense avoir trouvé la solution à mon problème, avec votre aide

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

Discussions similaires

  1. [PROC] Importer fichier Excel sous Sas Entreprise Guide 4
    Par lovelylife dans le forum SAS Base
    Réponses: 0
    Dernier message: 03/06/2015, 14h47
  2. Concaténer 2 fichiers txt sous SAS avec retour chariot
    Par valboubou dans le forum SAS Base
    Réponses: 2
    Dernier message: 03/02/2014, 16h52
  3. [AC-2003] Importer fichier csv sous access fichier .ini
    Par mmmxtina dans le forum VBA Access
    Réponses: 0
    Dernier message: 21/07/2009, 10h55
  4. Importation Fichier TXT sous SAS
    Par marinaines dans le forum Macro
    Réponses: 1
    Dernier message: 03/04/2009, 12h10
  5. Réponses: 1
    Dernier message: 11/08/2005, 17h33

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