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 :

Vérification des formats à l'importation d'un fichier csv [DATA]


Sujet :

SAS Base

  1. #1
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut Vérification des formats à l'importation d'un fichier csv
    Bonjour,

    Je dispose d'un fichier csv que je veux importer en table SAS, ainsi qu'un dictionnaire de données m'indiquant le format des variables. Le dictionnaire des données n'est pas complètement fiable. Le fichier comporte des millions de lignes, donc pas moyen de vérifier les formats avant l'importation.

    J'utilise un code de la forme suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    data table_sas;
    infile fichier_csv firstobs=2 dlm=';' DSD;
    infomat var1 $9.;
    informat var2 1.;
    ...
    input var1 var2 ...;
    run;
    En cas d'erreur de format les données ne sont pas correctement importées mas je n'ai pas de message dans la log.
    Comment faire pour avoir un message d'avertissement en cas d'erreur de format?

  2. #2
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Tu peux poster le résultat de la commande?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    proc options group=errorhandling;run;
    ainsi que la log de l'import
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  3. #3
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    C'est trop long sur le fichier complet, voici un exemple du problème rencontré:

    -Le fichier csv:

    X;Y
    ABC;123
    ABCD;12356789

    -Le code pour l'importation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    data testimport;
    infile "C:\TESTS\testimport.csv" firstobs=2 delimiter=';' DSD ;
    informat X $3.;
    informat Y 3.; length Y 3.;
    input X Y ;
    run;
    -Les données importées:

    ABC 123
    ABC 12355584

    -La log:
    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
     
    NOTE: The infile "C:\TESTS\testimport.csv" is:
          Filename=C:\TESTS\testimport.csv,
          RECFM=V,LRECL=256,File Size (bytes)=29,
          Last Modified=18 avril 2013 15 h 06,
          Create Time=18 avril 2013 14 h 40
     
    NOTE: 2 records were read from the infile "C:\TESTS\testimport.csv".
          The minimum record length was 7.
          The maximum record length was 13.
    NOTE: The data set WORK.TESTIMPORT has 2 observations and 2 variables.
    NOTE: DATA statement used (Total process time):
          real time           0.01 seconds
          cpu time            0.01 seconds
     
    -Le résultat de la proc options GROUP=errorhandling:
     
    BYERR     Set the error flag if a null data set is input to the SORT procedure
    CLEANUP     Attempt recovery from out-of-resources condition
    NODMSSYNCHK   Do not enable syntax check, in windowing mode, for a submitted statement  block
    DSNFERR     Generate error when SAS data set not found condition occurs
    NOERRORABEND      Do not abend on error conditions
    NOERRORBYABEND    Do not abend on By-group error condition
    ERRORCHECK=NORMAL Level of special error processing to be performed
    ERRORS=20     Maximum number of observations for which complete error messages are printed
    FMTERR   Treat missing format or informat as an error
    QUOTELENMAX   Enable warning for quoted string length max
    NOSTEPCHKPT    Do not activate the data step and procedure checkpointing feature
    STEPCHKPTLIB=WORK Identifies the library for storing the checkpoint record.
    NOSTEPRESTART     Do not activate the data step and procedure restarting feature
    SYNTAXCHECK       Put SAS into syntaxcheck mode
    VNFERR            Treat variable not found on _NULL_ SAS data set as an error

  4. #4
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Fichier CSV
    La deuxième colonne est de type caractère sur la 1ére ligne et numérique sur la deuxième!!!
    C'est normal qu'il y ai des plantages!!
    Comment tu traites ce cas après?
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  5. #5
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Le problème n'est pas là: la première ligne est la ligne d'intitulés des variables. L'importation commence à la seconde ligne (firstobs=2).

    L'erreur est dans la longueur insuffisante de la variable caractère X et dans la length insuffisante pour la variable numérique Y. Mais ce n'était pas ma question, c'était un exemple pour illustrer ce qui se passe. J'essaie de reformuler plus clairement ma question:

    Je veux optimiser la taille de ma base sas importée à partir d'un fichier csv. Je me base sur le dictionnaire des données pour prendre le moins de place mémoire possible. Il y a hélas des erreurs dans ce dictionnaire (longueurs insuffisantes comme dans l'exemple précédent) ce qui génére de fausses données sans que j'aie le moindre message d'avertissement. J'en ai trouvé par hasard mais je ne sais pas s'il y en a d'autres.

    La question est donc: comment obtenir un message d'erreur lorsque l'informat ou la length sont mal définis?

  6. #6
    Membre émérite

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Mars 2005
    Messages
    1 364
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2005
    Messages : 1 364
    Points : 2 329
    Points
    2 329
    Par défaut
    Tu as une macro variable qui est initialisée à la fin de chaque étape data &syserr qui t'indiquera si il y a eu des erreurs, warning lors du traitement de l'étape data.

    http://support.sas.com/documentation...a000208995.htm
    Il y a la variable _ERROR_ si tu veux faire un contrôle sur chaque ligne
    http://support.sas.com/documentation...a000695104.htm
    Consultez les FAQs et les anciens postes avant de poser vos questions. Merci

  7. #7
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Le problème c'est que l'étape data ne génère aucun warning: &syserr et _error_ restent à 0.

  8. #8
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Hello,
    SAS ne peut pas génerer une erreur dans la LOG s'il n'y a pas réellement d'erreur, les données importées ont été tronqué car la longueur de stockage que t'as spécifié était insufaisante pour stocker (en Bytes) tous les chiffres importé , du coup SAS donne la valeur arrondie selon la longueur de stockage spécifiée.

    En numérique, je te conseil d'utiliser le length 8 par défaut.

    Pour en savoir plus sur comment sas stock les valeurs numériques voir ICI

    Pour faire simple, tu peux passer par une proc import et utiliser l'option
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    proc import datafile="C:\TESTS\testimport.csv" out=testimport dbms=DLM replace;
    delimiter=";";
    getnames=yes ;
    GUESSINGROWS=7200;
    run;
    En étape data tu peux faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    DATA testimport;
    INFILE "C:\TESTS\testimport.csv" firstobs=2 delimiter=';' DSD ;
    informat X $3.;
    informat Y best.; length Y 8.;
    input X Y ;
    run;
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  9. #9
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Merci s_a_m pour les propositions, hélas cela n'optimise pas la quantité d'espace alloué. Du coup je traîne des tables de plus de 500 Go, pas très manipulables.

    La seule solution pour minimiser l'espace est probalement de fixer soi-même les longueurs, mais dans ce cas il me faut impérativement un avertissement en cas de mauvaise spécification. Ce que je n'arrive pas à avoir.

  10. #10
    Membre expérimenté
    Homme Profil pro
    Attaché statisticien
    Inscrit en
    Mai 2011
    Messages
    687
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Attaché statisticien
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Mai 2011
    Messages : 687
    Points : 1 581
    Points
    1 581
    Par défaut
    Bonsoir,

    pour essayer de minimiser les cas de troncature, tout en gardant une taille acceptable des tables produites peut-être pourrais tu regarder avec profit l'options GUESSINGROWS= de la proc import avec un paramètrage du type
    GUESSINGROWS=1000000 par exemple (ou beaucoup plus encore....) ?

    http://support.sas.com/documentation...6m99jypcwi.htm

  11. #11
    Modérateur

    Homme Profil pro
    Consultant en Business Intelligence
    Inscrit en
    Février 2011
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Consultant en Business Intelligence
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2011
    Messages : 1 624
    Points : 3 402
    Points
    3 402
    Par défaut
    Citation Envoyé par nowake Voir le message
    Merci s_a_m pour les propositions, hélas cela n'optimise pas la quantité d'espace alloué. Du coup je traîne des tables de plus de 500 Go, pas très manipulables.

    La seule solution pour minimiser l'espace est probalement de fixer soi-même les longueurs, mais dans ce cas il me faut impérativement un avertissement en cas de mauvaise spécification. Ce que je n'arrive pas à avoir.
    Tu peux combiner plusieurs techniques pour optimiser le stockage.
    Il y a des options ( Algo) qui permettent de compresser les tables. J'ai donné un exemple ici.

    Pour ce qui est de la longueur des variables. Tu peux tailler tes variables caractères voir ce post.

    Pour les variables Numérique: c'est un peu dangereux si tu ne connais pas ne nombre de position avant l'importation. Néamoins, tu peux passer par une étape intermédiaire qui lit le fichier et détermine la longueur maximum de tes variables numérique et appliquer par la suite le length approprié (dangereux si les chiffres évoluent).

    Si tu ne vois pas comment faire, on pourra t'aider mais il te faut des étapes intermédiaires.
    N'oubliez pas de consulter les FAQ SAS et les cours et tutoriels SAS
    N'oubliez pas de mettre votre message à si la solution donnée résout votre problème

  12. #12
    Candidat au Club
    Homme Profil pro
    Biostatisticien
    Inscrit en
    Avril 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Biostatisticien
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2013
    Messages : 6
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Merci pour vos réponses. Je vais esssayer de combiner compression et optimisation des longueurs.

    Pour optimiser les longueurs des variables numériques, je ne vois pas d'autre solution que de les lire une première fois en format texte pour en trouver la longueur maximum, et refaire l'étape d'importation correcte en fonction des résultats. S'il y a mieux je suis preneur. Ca revient peut-être à utiliser l'option GUESSINGROWS sur l'intégralité des données mais sur les quelques essais que j'ai fait ça n'optimisait pas la longueur (length) des variables (les longueurs n'étaient jamais insuffisantes mais souvent trop grandes).

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 07/06/2011, 14h50
  2. Vérification des droits d'accès sur un fichier ou vers un repertoire
    Par subzero82 dans le forum Développement de jobs
    Réponses: 1
    Dernier message: 15/04/2011, 13h51
  3. Gestion des spécifications d'import d'un fichier texte
    Par Julien Dufour dans le forum VBA Access
    Réponses: 2
    Dernier message: 13/08/2008, 07h30
  4. Réponses: 2
    Dernier message: 04/06/2007, 15h39
  5. modifier des formats d'import/export
    Par plaf dans le forum Access
    Réponses: 5
    Dernier message: 08/09/2005, 18h58

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