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 :

PROC EXPORT: Supprimer le délimiteur dans le fichier texte pour les valeurs manquantes [PROC]


Sujet :

SAS Base

  1. #1
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut PROC EXPORT: Supprimer le délimiteur dans le fichier texte pour les valeurs manquantes
    Bonjour,

    J'éxecute un programme SAS qui émet un listing de données incohérentes. J'ai besoin d'exporter ces données dans un fichier texte de type .csv.
    J'importe ensuite ce fichier texte dans une base de données. J'ai, dans mon listing, des enregistrements manquants pour les variables CHAMP2 et VALEUR2.
    Pour pouvoir importer mes résultats dans la base de données, j'ai besoin de supprimer les enregistrements ";" pour les variables CHAMP2 et VALEUR2 (refT=ANTICIP) puisqu'ils ne sont pas recensés dans ma base de données de destination.

    Voici ma commande:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc export data DBMS=csv outfile='Chemin_d’accès Draft 01082014.csv' replace ;
    delimiter=';'; 
    run;
    Voici mon listing en .csv ouvert avec Excel:
    RefT Patient Champ1 Valeur1 Champ2 Valeur2
    TEST1 1 1030 4122007 120030 1072007
    ANTICIP2 2 102030 9082014
    TEST3 2 114030 1022001 102030 9082014
    TEST4 2 118030 15022001 116030 1032001
    TEST5 2 121030 1052015
    TEST6 2 301030 4092015 97030 6092016
    ANTICIP7 5 97030 6092016
    TEST8 6 102030 28032007 51030 6082007

    Voici mon listing ouvert avec le bloc notes:
    RefT;Patient;Champ1;Valeur1;Champ2;Valeur2
    TEST1;1;1030;4122007;120030;1072007
    ANTICIP2;2;102030;9082014;;
    TEST3;2;114030;1022001;102030;9082014
    TEST4;2;118030;15022001;116030;1032001
    TEST5;2;121030;1052015;;
    TEST6;2;301030;4092015;97030;6092016
    ANTICIP7;5;97030;6092016;;
    TEST8;6;102030;28032007;51030;6082007

    Comment je peux faire pour enregistrer le délimiteur ";" pour les tests de type ANTICIP qui n'ont pas de champ2 de référence?

    Je vous remercie pour votre aide,
    Elodie

  2. #2
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut PROC EXPORT: Supprimer le délimiteur dans le fichier csv en cas de données manquantes
    Bonjour,

    J'éxecute un programme SAS qui émet un listing de données incohérentes. J'ai besoin d'exporter ces données dans un fichier texte de type .csv.
    J'importe ensuite ce fichier texte dans une base de données. J'ai, dans mon listing, des enregistrements manquants pour les variables CHAMP2 et VALEUR2.
    Pour pouvoir importer mes résultats dans la base de données, j'ai besoin de supprimer les enregistrements ";" pour les variables CHAMP2 et VALEUR2 (refT=ANTICIP) puisqu'ils ne sont pas recensés dans ma base de données de destination.

    Voici ma commande:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    proc export DATA DBMS=csv OUTFILE='Chemin_d’accès Draft 01082014.csv' REPLACE ;
    delimiter=';'; 
    run;
    Voici mon listing en .csv ouvert avec Excel:
    RefT Patient Champ1 Valeur1 Champ2 Valeur2
    TEST1 1 1030 4122007 120030 1072007
    ANTICIP2 2 102030 9082014 
    TEST3 2 114030 1022001 102030 9082014
    TEST4 2 118030 15022001 116030 1032001
    ANTICIP5 2 121030 1052015 
    TEST6 2 301030 4092015 97030 6092016
    ANTICIP7 5 97030 6092016 
    TEST8 6 102030 28032007 51030 6082007
    Voici mon listing ouvert avec le bloc notes:
    RefT;Patient;Champ1;Valeur1;Champ2;Valeur2
    TEST1;1;1030;4122007;120030;1072007
    ANTICIP2;2;102030;9082014;;
    TEST3;2;114030;1022001;102030;9082014
    TEST4;2;118030;15022001;116030;1032001
    ANTICIP5;2;121030;1052015;;
    TEST6;2;301030;4092015;97030;6092016
    ANTICIP7;5;97030;6092016;;
    TEST8;6;102030;28032007;51030;6082007
    Comment je peux faire pour SUPPRIMER (et non enregistrer comme écrit dans le précédent message ) le délimiteur ";" pour les tests de type ANTICIP qui n'ont pas de champ2 ni de valeur 2 de référence?

    Je vous remercie pour votre aide,
    Elodie

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 99
    Points : 202
    Points
    202
    Par défaut
    Salut,

    Ctrl+h, dans le bloc notes?

  4. #4
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour Nahel,

    Je vais importer le fichier texte dans une base de données ensuite et j'aimerai automatiser au maximum le traitement de ces données.
    Dans mon exemple, il n'y a que 3 tests à corriger mais j'en ai en réalité beaucoup plus (je peux avoir plus de 1000 enregistrements à chaque éxécution du programme SAS). J'ai peur que le CTL+H génère des erreurs.
    D'autant plus que je ne veux supprimer que les enregistrements manquants pour les 2 dernières colonnes de mon tableau.

  5. #5
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2012
    Messages
    99
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Deux Sèvres (Poitou Charente)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2012
    Messages : 99
    Points : 202
    Points
    202
    Par défaut
    Soit! (même si je ne comprends pas pourquoi un raccourci clavier générerait plus d'erreurs )

    Tu n'as qu'à modifier ton listing avant l'export , non?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    data;
    set;
    if missing(champ2) and missing(valeur2) then delete;
    run;

  6. #6
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Cette option supprime mon enregistrement alors que je veux quand même garder ces informations.
    Par exemple, je peux avoir:
    - un enregistrement avec seulement Champ1/Valeur1 remplis,
    - mais aussi des enregistrements avec Champ1/Valeur1 et Champ2/Valeur2 remplis
    - ou encore un autre enregistrement avec Champ1/Valeur1 remplis, Champ2/Valeur2 remplis et Champ3/Valeur3 remplis.

    Les variables Champ et Valeur fonctionnent par couple.
    J'aimerai pouvoir importer dans ma BD tous les enregistrements même ceux où je n'ai qu'un seul couple Valeur/Champ.
    Il n'existe pas une option avec un NMISS dans la Proc Export ?

  7. #7
    Membre éprouvé
    Avatar de m.brahim
    Homme Profil pro
    SAS / BIG DATA
    Inscrit en
    Juillet 2011
    Messages
    461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : SAS / BIG DATA
    Secteur : Conseil

    Informations forums :
    Inscription : Juillet 2011
    Messages : 461
    Points : 1 119
    Points
    1 119
    Billets dans le blog
    14
    Par défaut
    Bonjour,

    Je te propose une solution de contournement.
    Etape 1: remplacer les valeurs manquantes par un format
    Etape 2 : exporter les données avec un 'format'. Les séparateurs ";" successifs ne vont pas apparaître lors de l'exportation
    Etape3 : importer la table exportée avec ce nouveau format
    Etape 4: remettre la table à son état initiale.

    Voici le code que j'ai testé

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    data table1;
    input id $ v2 v3;
    cards;
    1 37483 .
    2 . 83478
    3 758 7848
    4 584 4785
    5 849 49549
    6 . 73
    7 . .
    8 347 .
    ;
    run;
     
    /*Etape1*/
     
    %macro format;
    data table2(drop=n);
    set table1;
    array vars (*) _numeric_;
    do n=1 to dim(vars);
    if vars(n) = . then vars(n)=9999.9999;
    end;
    run;
    %mend;
    %format;
     
     
    /*Etape2*/
    proc export DATA=table2 DBMS=csv OUTFILE='C:\01082016.csv' REPLACE ;
    delimiter=';'; 
    run; 
     
    /*Etape3*/
     
    proc import 
    dbms=csv datafile='C:\01082016.csv' 
    out=test_import replace; 
    DELIMITER = ";" ;
    run;
     
    /*Etape4*/
     
     
    %macro format1;
    data table3(drop=n);
    set test_import;
    array vars (*) _numeric_;
    do n=1 to dim(vars);
    if vars(n) = 9999.9999 then vars(n)=.;
    end;
    run;
    %mend;
    %format1;

    Cordialement

  8. #8
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    747
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 747
    Points : 978
    Points
    978
    Par défaut
    Citation Envoyé par Elodie3483 Voir le message
    J'éxecute un programme SAS qui émet un listing de données incohérentes. J'ai besoin d'exporter ces données dans un fichier texte de type .csv.
    J'importe ensuite ce fichier texte dans une base de données. J'ai, dans mon listing, des enregistrements manquants pour les variables CHAMP2 et VALEUR2.
    Pour pouvoir importer mes résultats dans la base de données, j'ai besoin de supprimer les enregistrements ";" pour les variables CHAMP2 et VALEUR2 (refT=ANTICIP) puisqu'ils ne sont pas recensés dans ma base de données de destination.
    Le pb n'est pas dans la PROC EXPORT mais dans l'outil qui importe les données. Il devrait (doit?!) savoir gérer les cas des valeurs manquantes.
    Comme tu le montre Excel sait le faire, donc si Excel sait le faire, alors ton outil d'importation en Base de données le devrait aussi.

    X

  9. #9
    Membre actif
    Inscrit en
    Juillet 2010
    Messages
    199
    Détails du profil
    Informations forums :
    Inscription : Juillet 2010
    Messages : 199
    Points : 214
    Points
    214
    Par défaut
    Bonjour,

    Tu peux essayer de changer de délimiteur, au lieu du point virgule tu prends un espace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROC EXPORT DATA=test DBMS=tab OUTFILE="&sortie.\test.csv" REPLACE ;
    	DELIMITER='09'x; 
    RUN;

  10. #10
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par mohamed_ Voir le message
    Bonjour,

    Tu peux essayer de changer de délimiteur, au lieu du point virgule tu prends un espace

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    PROC EXPORT DATA=test DBMS=tab OUTFILE="&sortie.\test.csv" REPLACE ;
    	DELIMITER='09'x; 
    RUN;

    Bonjour,

    Merci pour cette proposition mais ça ne fonctionne pas non plus. La Base de Données ne gère pas les données manquantes pour l'import de fichiers externes.
    Si quelqu'un voit une autre possibilité, je suis preneuse car je n'arrive pas à résoudre ce problème.

  11. #11
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par m.brahim Voir le message
    Bonjour,

    Je te propose une solution de contournement.
    Etape 1: remplacer les valeurs manquantes par un format
    Etape 2 : exporter les données avec un 'format'. Les séparateurs ";" successifs ne vont pas apparaître lors de l'exportation
    Etape3 : importer la table exportée avec ce nouveau format
    Etape 4: remettre la table à son état initiale.

    Voici le code que j'ai testé

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    data table1;
    input id $ v2 v3;
    cards;
    1 37483 .
    2 . 83478
    3 758 7848
    4 584 4785
    5 849 49549
    6 . 73
    7 . .
    8 347 .
    ;
    run;
     
    /*Etape1*/
     
    %macro format;
    data table2(drop=n);
    set table1;
    array vars (*) _numeric_;
    do n=1 to dim(vars);
    if vars(n) = . then vars(n)=9999.9999;
    end;
    run;
    %mend;
    %format;
     
     
    /*Etape2*/
    proc export DATA=table2 DBMS=csv OUTFILE='C:\01082016.csv' REPLACE ;
    delimiter=';'; 
    run; 
     
    /*Etape3*/
     
    proc import 
    dbms=csv datafile='C:\01082016.csv' 
    out=test_import replace; 
    DELIMITER = ";" ;
    run;
     
    /*Etape4*/
     
     
    %macro format1;
    data table3(drop=n);
    set test_import;
    array vars (*) _numeric_;
    do n=1 to dim(vars);
    if vars(n) = 9999.9999 then vars(n)=.;
    end;
    run;
    %mend;
    %format1;

    Cordialement
    Bonjour,

    Merci pour ta proposition mais je ne comprend pas où ça mène.
    Je met un format là où j'ai des données manquantes et je réimporte ma table dans SAS en remplaçant le format par les données manquantes.
    Au final, j'ai toujours un '.' pour représenter les observations manquantes ou alors le format 999.9999 qui n'ess pas reconnu par ma base de données...

  12. #12
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Morbihan (Bretagne)

    Informations forums :
    Inscription : Juillet 2008
    Messages : 20
    Points : 26
    Points
    26
    Par défaut
    Salut Elodie,

    J'ai peut-être une solution...pas forcément très propre et à optimiser, mais qui semble correspondre à ce que tu recherches :


    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
     
     
    /*Etape 1, on récupère le nom des variables de ta table sas
    dans une macrovariable (avec pour séparateur le ;) pour la stocker dans une table
    */
     
    proc sql;
    select name into : mvlist separated by ";"
    from sashelp.vcolumn
    where memname="TATABLE"
    order by varnum;
    quit;
     
    data listvar;
    length varexp $100;
    varexp="&mvlist.";
    run;
     
    /*Etape 2, on créé une variable contenant l'ensemble du contenu des variables
    avec gestion du si c'est ANTICIP
    */
     
    data yoyo (keep= varexp);
    set TATABLE;
    length varexp $100;
    if substr(upcase(reft),1,7) = 'ANTICIP' then varexp=compress(reft!!';'!!patient!!';'!!champ1!!';'!!valeur1);
    else varexp = compress(reft!!';'!!patient!!';'!!champ1!!';'!!valeur1!!';'!!champ2!!';'!!valeur2);
    run;
     
     
    /*Etape 3 : On créé la table à exporter avec la liste des var en première ligne*/
    data tabfin;
    set listvar yoyo;
    run;
     
     
    /*Etape 4 : On exporte le tout...avec l'option putnames=no si tu as une version de SAS récente (9.2 et plus...)
    qui permet de ne pas exporter le nom de la variable (si tu as une version plus ancienne, il faudrait faire
    l'export via un data file
    */
     
    proc export DATA=tabfin DBMS=dlm OUTFILE='C:\test\test.csv' REPLACE ;
    PUTNAMES=no; 
    run;

    Bon courage et n'hésite pas s'il y a des points que tu ne comprends pas


    Julien.

  13. #13
    Membre à l'essai
    Femme Profil pro
    Étudiant
    Inscrit en
    Août 2014
    Messages
    18
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2014
    Messages : 18
    Points : 13
    Points
    13
    Par défaut
    Bonjour Julien,

    Merci pour ta proposition. Effectivement ça fonctionne mais ça alourdit beaucoup mon programme.
    Je met ce point de côté et je recherche une autre solution plus optimale.

    Merci à tous pour vos réponses !

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

Discussions similaires

  1. Delphi7 - Export d'une table dans un fichier texte
    Par jer64 dans le forum Bases de données
    Réponses: 4
    Dernier message: 02/06/2006, 01h33
  2. Réponses: 2
    Dernier message: 18/05/2006, 14h38
  3. Supprimer une ligne dans un fichier texte
    Par @yoyo dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 28/03/2006, 15h19
  4. Supprime une ligne dans un fichier texte
    Par dev7 dans le forum Linux
    Réponses: 4
    Dernier message: 28/03/2006, 02h33
  5. Supprimer une ligne dans un fichier text
    Par philippe13 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 14/03/2006, 17h43

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