1. #1
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut [Data] En fonction d'une condition supprimer les lignes suivantes

    Bonjour à tous,

    J'ai un fichier en entrée pas très simple d'utilisation, il s'agit d'un fichier Excel que j'importe sous SAS.
    Voici un aperçu du fichier :

    Nom des colonnes + données :

    A|B|C|D|E...T

    2016| | | 125 | 135
    semaine| | | |
    1 | | | 12 | 3
    2 | | | 258 | 0
    3 | | | 120 | 3
    4 | | | 0 | 5
    ...
    52 | | | 0 | 15

    2017| | | 125 | 135
    semaine| | | |
    1 | | | 12 | 3
    2 | | | 258 | 0
    3 | | | 120 | 3
    4 | | | 0 | 5
    ...
    52 | | | 0 | 15


    Le fichier va grandir avec les années suivantes.

    J'aimerai savoir si il est possible de récupérer les 52 suivantes après 2016 et après 2017 ?

    Merci à vous pour votre aide.

  2. #2
    Membre éprouvé
    Avatar de Stackware
    Homme Profil pro
    ArchiDuc de la Sasserie
    Inscrit en
    juillet 2013
    Messages
    369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : ArchiDuc de la Sasserie
    Secteur : Conseil

    Informations forums :
    Inscription : juillet 2013
    Messages : 369
    Points : 927
    Points
    927
    Billets dans le blog
    4

    Par défaut

    Bonjour,
    Le formatage actuel des données est sûrement très bien pour Excel, en mode présentation, mais pas terrible dans une logique tabulaire et relationnelle.
    En imaginant, par exemple, un enregistrement du type :
    Année | Semaine | donnée 1 | donnée 2 | ...

    Il serait très simple d'abord de charger cela dans SAS, puis de l'exploiter, en sélectionnant les lignes avec année = 2018 par exemple.
    Pour les données correspondant à une année mais pas une semaine en particulier, il suffirait de mettre 0 en n° de semaine.
    BTW : certaines années ont 53 semaines (comme 2020) : on fait comment ?
    En bref, un effort de structuration des données rendrait les choses bien plus simples.
    Au pire, on peut imaginer 2 tables : 1 table des années avec les données particulières, et une des semaines avec leurs données aussi, ayant pour clé commune l'année, bien sûr.
    En dénormalisant le modèle, ça donne une seule table, avec les données de l'année (répétées sur chaque ligne), le n° de la semaine et les données de la semaines.
    C'est moche, mais il n'y a qu'une seule table...

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    Merci pour les explications mais je ne peux pas changer le format en entrée je dois laisser tel quel...

    Comment modifier tout ça sur SAS?

  4. #4
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2008
    Messages : 1 777
    Points : 3 926
    Points
    3 926

    Par défaut

    Bonsoir.
    Ça peut se faire sans trop de complications si tu importes ton fichier en texte, dans une étape Data, avec INFILE/INPUT. Ça suppose donc que tu transformes ton fichier Excel en fichier plat, par exemple CSV ou (perso je préfère) TXT à séparateur tabulation. L'idée est de lire une ligne en plusieurs fois, avec INPUT ... @ ; où le @ "met en pause" la lecture, qu'on reprend avec une autre instruction INPUT. Entre les deux, on peut faire des tests sur ce qu'on a déjà lu, et décidé de la suite. Dans ton cas ça ressemblerait à quelque chose comme...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    RETAIN annee ;
    INPUT x :$50. @ ;
    IF NOT ANYDIGIT(x) THEN DO ; /* cas où X="semaine" */
      INPUT ; /* fini pour cette ligne */
      DELETE ; /* on ne garde rien */
    END ;
    ELSE IF INPUT(x, 4.) > 60 THEN DO ; /* cas où X contient une année */
      INPUT @1 annee :4. ; /* on lit cette année (@1 "rembobine" la lecture au début de la ligne) + RETAIN de la variable ==> on l'aura aux autres observations */
      DELETE ; /* on ne garde rien ; j'ai supposé que 125 et 135 ne te servaient à rien */
    END ;
    ELSE INPUT @1 semaine :2. var1  var2   var3 ... ; /* et sinon c'est une ligne avec un numéro de semaine et les autres variables à collecter */
    Bon courage.
    Olivier

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    Merci mais je ne peux vraiment pas modifier ce fichier excel, je dois les récupérer toutes les semaines en automatique.

    Est-ce indispensable de le transformer en CSV ou TXT ?


    Si c'est le cas je n'ai pas d'autre choix de récupérer en dur sur 10 ans par exemple (2017,2018 etc) et prier que le formalisme ne change pas...

  6. #6
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2008
    Messages : 1 777
    Points : 3 926
    Points
    3 926

    Par défaut

    Malheureusement INFILE / INPUT ne traite que des fichiers plats, donc pas de XLS directement.
    Bon courage.
    Olivier

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    Même si j'importe mon fichier XLS en entier dans une table SAS?

    Merci de ton aide.

  8. #8
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2008
    Messages : 1 777
    Points : 3 926
    Points
    3 926

    Par défaut

    Ça déplace le problème : au lieu d'être un souci à l'import, ça devient un souci de gestion de texte sous SAS : reconnaître une ligne à son contenu, la conserver ou l'éliminer selon ce qu'on a reconnu.
    Pourquoi pas. Si ta proc Import reconnaît bien toutes les colonnes c'est une solution qui peut être gagnante.
    Bon courage.
    Olivier

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    La PROC IMPORT est relativement fiable et importe à l'identique mon fichier EXCEL.

    Toutefois, à partir de cette table je n'arrive pas à lui dire "tiens dès que tu vois une année dans la 1ère colonne (2016,2017...), je veux que tu me prennes les 53 lignes suivantes pour les mettre dans une table bien à part"

    Merci de ton aide.

  10. #10
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2008
    Messages : 1 777
    Points : 3 926
    Points
    3 926

    Par défaut

    Je tenterais quelque chose comme IF ANYALPHA(STRIP(var1)) pour repérer que var1 contient un texte ("semaine"). Et pour repérer une année, IF NOT ANYALPHA(STRIP(var1)) AND INPUT(var1, 4.) > 60.
    Bon courage.
    Olivier

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    Malheureusement cela ne fonctionne pas comme je le souhaite :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    data titi;
    set Nombre_analyses_&Year.;
    IF ANYALPHA(STRIP(A));
    /*IF NOT ANYALPHA(STRIP(A)) AND INPUT(A, 4.) > 60.;*/
    run;

    Il me donne les lignes qui comportent "Semaine" mais pas les 53 lignes d'après...

    Merci de ton aide

  12. #12
    Membre expert
    Avatar de olivier.decourt
    Homme Profil pro
    Formateur R/SAS/statistiques
    Inscrit en
    avril 2008
    Messages
    1 777
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur R/SAS/statistiques
    Secteur : Conseil

    Informations forums :
    Inscription : avril 2008
    Messages : 1 777
    Points : 3 926
    Points
    3 926

    Par défaut

    Non, on s'est mal compris. Quand tu repères une ligne "Semaine" ou "Année", tu l'élimines avec une instruction DELETE. Les autres (les 52/53 semaines) seront conservées.
    Si tu veux avoir une trace de l'année, tu copies VAR1 dans une variable ANNEE faisant l'objet d'un RETAIN quand tu repères une ligne "Année".
    Bon courage.
    Olivier

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    janvier 2006
    Messages
    164
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : janvier 2006
    Messages : 164
    Points : 82
    Points
    82

    Par défaut

    Merci pour tes explications Olivier mais je suis passé par la solution "moche mais efficace" en comptant le nombre de ligne en dur. Je l'ai fait sur plusieurs années cela fonctionne mais c'est horrible.

  14. #14
    Membre confirmé
    Inscrit en
    novembre 2009
    Messages
    232
    Détails du profil
    Informations forums :
    Inscription : novembre 2009
    Messages : 232
    Points : 493
    Points
    493

    Par défaut Instruction retain

    Bonjour,

    Voici la mise en oeuvre de la solution d'Olivier :

    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
    data test;
      input A $ B C;
      cards;
    2016 125 135
    semaine . .
    1 12 3
    2 258 0
    3 120 3
    2017 125 135
    semaine . .
    1 12 3
    2 258 0
    3 120 3
    4 0 5
    ;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    data test;
      set test;
      if A="semaine" then delete;
      retain annee;
      if input(A,8.)>60 then do;
        annee=A;
        delete;
      end;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A      B    C    annee
    1     12    3    2016
    2    258    0    2016
    3    120    3    2016
    4      0    5    2016
    1     12    3    2017
    2    258    0    2017
    3    120    3    2017
    4      0    5    2017
    Si la variable A ne correspond pas aux numéros de semaines, il est aussi possible aussi les numéroter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    data test;
      set test;
      by annee;
      if first.annee then semaine=1;
      else semaine=semaine+1;
      retain semaine;
    run;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    A      B    C    annee    semaine
    1     12    3    2016        1
    2    258    0    2016        2
    3    120    3    2016        3
    4      0    5    2016        4
    1     12    3    2017        1
    2    258    0    2017        2
    3    120    3    2017        3
    4      0    5    2017        4
    Cordialement,

Discussions similaires

  1. Surligner les lignes en fonction d'une condition
    Par Jeannot40260 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/08/2016, 11h36
  2. Construire un range avec une condition sur les lignes
    Par tamtam64 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 22/06/2015, 22h57
  3. [XL-2007] Compter les cellules identiques en fonction d'une condition
    Par pecroxxxx dans le forum Excel
    Réponses: 9
    Dernier message: 31/03/2013, 22h41
  4. une fonction qui permet de supprimer les espaces
    Par inayatallah dans le forum Débuter
    Réponses: 5
    Dernier message: 03/01/2010, 17h36
  5. [CR 8] Supprimer une section en fonction d'une condition
    Par p_oum dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 15/10/2009, 12h45

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