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 de fichier .csv


Sujet :

SAS Base

  1. #1
    Membre éprouvé
    Import de fichier .csv
    Bonjour à tous,

    Je sèche un peu sur mon problème d'import ... et je suis un peu rouillé dans les options d'infile !

    Alors, pour résumer ...

    Je récupère un fichier .csv (séparateur ";"), qui contient entre autre, un champ commentaire.
    Celui-ci est entre double-côtes, mais peut contenir un retour à la ligne !!!

    Du coup, quand j'importe mon fichier, je me retrouve avec 2 lignes (logique me direz vous !) au lieu d'une seule ...
    J'ai bien essayé avec les options habituelles (DSD, MISSOVER, TRUNCOVER ...) mais rien à faire, je n'arrive à résoudre mon problème.

    Quelqu'un à t'il déjà été confronté à la même problématique ?

    Exemple de fichier reçu (dans ce cas, je dois charger 4 lignes dans ma table et pas 5):

    ID;VAR1;COMMENTAIRE;VAR2
    1;10;"toto tata";100
    2;20;"titi tutu";200
    3;30;"intervention sur le
    périphérique"
    ;300
    4;40;"ha ha ha";400

    Merci de votre aide !

  2. #2
    Expert confirmé
    Bonjour.
    Je te propose de travailler en 2 temps, une première lecture pour rectifier le fichier entrant en "raboutant" les deux morceaux de ligne séparées par le retour chariot intempestif (j'espère qu'il n'y en a qu'un au maximum). Une 2e lecture plus classique sur le fichier rectifié.
    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
    DATA _NULL_ ;
       LENGTH _ligne1_ _ligne2_ _res_ $ 4000 ;
       RETAIN _ligne1_ ;
       INFILE "c:/temp/edward.csv" LRECL=4000 ;
       FILE "c:/temp/edward2.csv" LRECL=4000 ;
       INPUT @ ; /* on lit la ligne et on attend */
       _ligne1_ = _infile_ ; /* on stocke la ligne lue */
       nbQuotes = COUNT(_infile_,'"') ;
       INPUT ; /* on lâche cette ligne, on passe à la suite */
       IF MOD(nbQuotes, 2) = 1 THEN DO ; /* une seule quote ? */
    	 INPUT ; /* on lit la ligne suivante */
    	 _ligne2_ = _infile_ ;
         _res_ = CATX(" ", _ligne1_, _ligne2_) ; /* on concatène à la précédente */
       END ;
       ELSE _res_ = _ligne1_ ;
       PUT _res_ ;
       PUTLOG _ALL_ ;
    RUN ;
     
    DATA work.edward ;
      INFILE "c:/temp/edward2.csv" LRECL=4000 DLM=";" DSD MISSOVER FIRSTOBS=2 ;
      INPUT ID VAR1 COMMENTAIRE :$3000. VAR2 ;
    RUN ;
    Bon courage.
    Olivier

  3. #3
    Membre éprouvé
    Bonjour Olivier,

    Merci pour la piste de corriger le fichier source ... j'avais espéré une option d'import mais non :-)

    Bon, comme j'ai plusieurs retour chariot, j'ai utilisé l'option recfm=n pour une lecture bit à bit et corriger si besoin (par chance, mes données à corriger sont entre côte !)

    Code :Sélectionner tout -Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    data _null_;
      infile "source.csv" 
    	recfm=n;
      file "sourcecorrigee.csv" 
    	recfm=n;
      input a $char1.;
      retain open 0;
      if a='"' then open=not open;
      if a='0A'x and open then put '7C'x @;
      else put a $char1. @;
    run;