Forum Programmation.autre [boulot] script pour récupérer des données

Posté par . Licence CC by-sa
0
24
oct.
2016

Bonjour à tous,

Mon département IT a baissé les bras devant une tâche ingrate : récupérer des données d'un vieux système pour les insérer dans SAP …

Mes vieilles données sont dans un tableau excel.

Colonne A | Colonne B

N° d'outil | info1
Info2
Info3
N° d'outil | info1

donc une ligne par n° mais beaucoup de lignes dans la cellule de la colonne B.
Or pour les uploader dans SAP, il faudrait avoir un fichier avec, par ligne, numéro + info. (donc une répétition du n° d'outil). A la main, ça marche très bien, je copie ma cellule de la colonne B dans un bête fichier texte, et ensuite je peux copier le tout dans un nouveau fichier excel et j'ai bien mes différentes lignes dans différentes cellules …

Maintenant question bête : comment automatiser ça, car vu le nombre de lignes …

Des idées ? (je suis une quiche en manipulation de fichiers …)

  • # Passage par un CSV

    Posté par . Évalué à 2.

    Bonjour,

    Le plus simple serait de convertir ton fichier Excel et fichier CSV.
    Ça permettrait de le manipuler plus facilement.

    Ensuite, un script simple (via le langage que tu préfère) qui vérifiera si tu à 1 ou 2 paramètres sur ta ligne fera la conversion vers un nouveau fichier CSV (que tu pourra ouvrir avec Excel).

    • [^] # Re: Passage par un CSV

      Posté par . Évalué à 1.

      Oui, ça passer par le csv, c'était évident.
      Ensuite comme j'étais au boulot, bah j'ai essayé un peu en vba … déjà j'aime pas et ensuite je connais très mal les syntaxes, donc j'ai pas abouti … même si je suis pas très loin. Je persévérerai demain, mais si je pouvais le faire sur ma distrib linux ça irait plus vite ;-)

      Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

  • # PYTHON + xlrd

    Posté par . Évalué à 2. Dernière modification le 24/10/16 à 15:01.

    Salut,

    xlrd est une librairie de lecture / écriture de fichiers excel, tu fais un petit script en python qui extrait les données des fichiers excel et qui les ré-injecte dans le SAP.

    Edit: … mais l'option ci dessus en bonne aussi … Fait gaffe quand même avec les séparateurs du CSV, c'est pas les même en français et en anglais, c'est une usine à bugs, les csv …
    Un bon outil pour manipuler les csv avec des séparateurs à la con (',', ";" ?), c'est libre office qui propose de choisir le séparateur à l'ouverture du fichier.

    Bon courage !

  • # My 2 cents

    Posté par (page perso) . Évalué à 1.

    Effectivement c'est faisable assez facilement en passant les données en CSV d'abord.

    Je suis pas le spécialiste de l'algo optimisé, juste de l'algo qui marche le temps de mon besoin, mais j'ai fais un fichier excel basique avec tes contraintes, je l'ai exporté en CSV (";") et j'ai réussi à le convertir assez simplement dans le format attendu grâce à quelques lignes de python.

    Assez basiquement donc, j'itère sur les lignes du fichier, je split sur le séparateur. J'obtiens donc la colonne 1 et la colonne 2 dans deux variables. Ensuite je split la colonne 2 sur le retour chariot, et je génère une ligne par valeur en reprenant à chaque fois la valeur de la colonne 1. Dans mon script je retire également la quote qu'Excel me place en début et fin de valeur pour la colonne 2.

    Pour le code, c'est par là que ça se passe : http://pastebin.com/03E63pYh

    • [^] # Re: My 2 cents

      Posté par . Évalué à 3.

      Quitte à utiliser python, j'aurai utilisé son module csv qui gère correctement la présence de retour à la ligne dans les cellules ainsi que les doubles quotes qui font partie de la norme.

    • [^] # Re: My 2 cents

      Posté par . Évalué à 1. Dernière modification le 24/10/16 à 20:07.

      Merci beaoucoup pour ce coup de pouce …

      Malheureusement, j'ai l'erreur suivante sur mon fichier :

      Traceback (most recent call last):
        File "./SoftAdmin.py", line 9, in <module>
          tab2 = tab[1].strip()[1:-1].split("\r")
      IndexError: list index out of range
      

      Saurais tu me dires où chercher. Je suis vraiment pas fortiche en python …
      Fichier trop gros ? (ça fera 7000 lignes).

      Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

      • [^] # Re: My 2 cents

        Posté par . Évalué à 1.

        Je comprends pas pourquoi la colonne 2 (ta2) n'existe pas …

        Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

      • [^] # Re: My 2 cents

        Posté par . Évalué à 1.

        Je comprends pas pourquoi la colonne 2 (ta2) n'existe pas …

        Je vous mets un exemple réel de mon fichier :
        colonne 1 => 973002
        colonne 2 =>
        "Support avec vis M4 x 12:

        W204334-021 = 3x
        W204334-022 = 2x
        W204334-024 = 2x
        W204334-032 = 2x
        W204334-033 = 2x
        W204334-039 = 2x
        W204334-040 = 3x
        W204334-041 = 2x
        W204334-044 = 2x
        W204334-049 = 1x"

        et je cherche donc à obtenir 12 lignes / 2 colonnes :
        973002 / "Support avec vis M4 x 12:
        973002 /
        973002 / W204334-021 = 3x
        973002 / W204334-022 …

        Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

  • # awk avec précautions

    Posté par . Évalué à 3. Dernière modification le 24/10/16 à 16:43.

    On suppose que le fichier est ouvrable par un tableur (msexcel ou lo.calc).
    On suppose aussi qu'il n'y a pas de retour à la ligne dans les cellules.
    Sinon, vois une solution à base de python qui gère bien les cellules sur plusieurs lignes et les double quotes avec son module csv.

    Tu exportes en csv avec un séparateur qui n’apparaît jamais dans une cellule, genre ";" ou "|" ou "$" ou "£".

    En awk, tu utilises un script du genre :
    awk -F\| 'NF>1 { cellA=$1; print $1 FS $2 next } { print cellA FS $1 next } < in.csv > out.csv

    • [^] # Re: awk avec précautions

      Posté par . Évalué à 2.

      Salut et merci pour cette réponse en apparence si simple mais :
      1) je connais pas awk
      2) je suis nul en expression régulière.

      tu pourrais détailler un peu car pour l'instant mon shell me sort ça : " > "
      J'ai donc l'impression qu'il ne se passe rien ? ou alors le temps d'exécution est très long ?

      Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

      • [^] # Re: awk avec précautions

        Posté par . Évalué à 2. Dernière modification le 24/10/16 à 22:22.

        J'ai donc l'impression qu'il ne se passe rien ? ou alors le temps d'exécution est très long ?

        Il manque une apostrophe dans sa commande :

        awk -F\| 'NF>1 { cellA=$1; print $1 FS $2 next } { print cellA FS $1 next }' < in.csv > out.csv
        

        je connais pas awk

        C’est pourtant l’outil tout indiqué…

        Je ne connais pas assez awk moi-même (je m’en sert pour d’autres manipulations) mais sa commande à l’air pas mal… (elle n’utilise pas d’expression régulière)

        L’option -F permet de définir le séparateur de champ (field), ici |, noté FS plus loin dans la commande… $1, $2, $3 représentent les valeurs des champs…

        • [^] # Re: awk avec précautions

          Posté par . Évalué à 1.

          haha, le ' qui fait mal ;-)

          ce que je ne comprends pas, c'est le manque de boucle / d'incrémentation. c'est normal ?

          en tout cas ça me donne l'erreur suivante :

          awk -F\; 'NF>1 { cellA=$1; print $1 FS $2 next } { print cellA FS $1 next }'< fichier1.csv > fichier2.csv
          awk: ligne de commande:1: NF>1 { cellA=$1; print $1 FS $2 next } { print cellA FS $1 next }
          awk: ligne de commande:1: ^ syntax error
          awk: ligne de commande:1: NF>1 { cellA=$1; print $1 FS $2 next } { print cellA FS $1 next }
          awk: ligne de commande:1: ^ syntax error

          Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

          • [^] # Re: awk avec précautions

            Posté par . Évalué à 2.

            Il manquait encore un truc :)

            tst@PC ~
            $ cat in.csv
            N° d'outil 42| info1
            Info2
            Info3
            N° d'outil 36| info1
            Info4
            Info5
            
            
            tst@PC ~
            $ awk -F\| 'NF>1 { cellA=$1; print $1 FS $2; next } { print cellA FS $1; next }' < in.csv > out.csv
            
            tst@PC ~
            $ cat out.csv
            N° d'outil 42| info1
            N° d'outil 42|Info2
            N° d'outil 42|Info3
            N° d'outil 36| info1
            N° d'outil 36|Info4
            N° d'outil 36|Info5
            N° d'outil 36|
            
            

            c'est le manque de boucle / d'incrémentation. c'est normal ?

            La boucle est implicite…

            • [^] # Re: awk avec précautions

              Posté par . Évalué à 1. Dernière modification le 25/10/16 à 11:59.

              ah, je comprends pourquoi ça marche pas sur mon fichier.

              mon fichier est construit un peu différemment en fait :

              celulle ligne 1 col 1 : n° d'outil 42
              Celulle ligne 1 col 2 : info1 (retour à la ligne) info2 (retour à la ligne) info3 …
              Celulle ligne 2 col 1 : n° d'outil 36
              Celulle ligne 2 cole 2 : info1 2 3 (le tout sur différentes lignes mais avec un retour chariot si tu veux, ce n'est pas dû à la taille de la celulle)

              NB : il manquait les ; ?

              Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

              • [^] # Re: awk avec précautions

                Posté par . Évalué à 2.

                mon fichier est construit un peu différemment en fait :

                Pourquoi tu l’as présenté comme tu l’as fait alors ? o_O

                C’est bien d’un document Excel dont on parle ? Dans ce cas la première étape c’est de l’exporter en CSV… Et nous montrer exactement (en utilisant les bonnes balises : https://linuxfr.org/wiki/aide-edition#code ) à quoi il ressemble ;)

                NB : il manquait les ; ?

                Oui, avant chaque instruction 'next'…

                Pour en revenir à la première apostrophe manquante, le fait que tu aies '>' (il s’agit du prompt de deuxième niveau…) devrait te mettre sur la voie. En effet, si le shell te met ça c’est qu’il attend la suite de la commande ! Vu que la première apostrophe indique le début d’une chaîne de caractères non-interprétée, quand tu appuies sur entrée il considère que tu veux entrer un caractère "fin de ligne" dans cette chaîne et pas valider la commande (ce à quoi tu t’attendais)

                Pour comprendre c’est très simple, essaye :

                $ echo 'toto

                tu vas arriver sur le prompt de deuxième niveau, là tu rentres :

                > titi'

                (note que dans la première commande '$' désigne le prompt de premier niveau, il ne faut pas le taper. Dans la deuxième commande '>' représente le prompt de deuxième niveau, il ne faut le taper non plus…). C’est configurable (pas obligé d’utiliser '$' et '>') mais par convention c’est ce qui est utilisé partout…

                en sortie tu auras :

                toto
                titi
                

                avec un retour à la ligne entre les deux mots. Tu as rentré sur deux lignes une commande qu’on aurait pu écrire sur une ligne : $ echo "toto\ntiti" (entre les guillemets doubles la suite de deux caractères \n représente le caractère "fin de ligne")

                • [^] # Re: awk avec précautions

                  Posté par . Évalué à 2.

                  \n représente le caractère "fin de ligne"

                  "saut de ligne" pour être exact.

                • [^] # Re: awk avec précautions

                  Posté par . Évalué à 1.

                  bon je vais persévérer et essayer de mieux comprendre awk, ça me servira sûrement plus tard.

                  Désolé pour la présentation, mais c'est pas comme si le wiki de linuxfr permettait de faire des tableaux, et je devais être un peu fatigué hier soir. Ca me semblait évident sur le moment mais en relisant mon poste, c'est clair que personne à par moi pouvait comprendre :-(

                  En attendant, j'ai quand même résolu mon problème avec un petit script qui s'inspire de vos idées (la tienne et le script python).

                  1) export en CSV dans "fichier source".
                  2) j'ai concaténé cellule 1 et 2 sur toutes les lignes in incluant un caractère reconnaissable ££ autour de mon n° d'outil.
                  3) j'ai écrit cette colonne dans "fichier destination" et je l'ai dupliquée (j'ai donc 2 colonnes identiques).
                  4) je fais une boucle sur la colonne 2 et j'efface mon n° d'outil. (donc je me retrouve avec mes instructions d'outil mais ligne par ligne et non plus dans une cellule entière. Plus de CR ou LF.
                  5) je fais une boucle sur la colonne 1 et j'efface tout sauf mon n° d'outil et si je ne trouve pas mon ££ je copie la valeur de la cellule précédente.

                  bref 3 min … mais j'avais le cerveau en compote hier soir.

                  Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

                  • [^] # Re: awk avec précautions

                    Posté par . Évalué à 3.

                    1) export en CSV dans "fichier source".

                    OK

                    2) j'ai concaténé cellule 1 et 2 sur toutes les lignes in incluant un caractère reconnaissable ££ autour de mon n° d'outil.

                    pourquoi ?

                    si tu fait bien ton export, ton CSV ca contenir

                    "No 1";"info1 info2 info3"
                    "No 2";"info4 info4 info6"

                    tu lis le fichier ligne par ligne
                    pour chaque ligne
                    tu recuperes les valeurs de colonne1 et colonne2 dans des variables (astuce le separateur c'est le ; )
                    pour chaque element contenu dans $colonne2, tu le parcours, et pour chaque element (astuce le separateur c'est le retour à la ligne)
                    tu ecris sur la sortie $colonne1;$element

                    ca devrait bien suffire.

                    • [^] # Re: awk avec précautions

                      Posté par . Évalué à 1.

                      pourquoi ?

                      Et bien je sais plus trop maintenant. En lisant vos explications, je me suis dit qu'entre les retours chariots et les retours à la ligne, j'allais peut être m'emmêler les pinceaux.

                      Il faut savoir que mon export n'est pas très propre car ça vient d'une base de données d'un soft propriétaire des années 80 et que les fins de ligne sont très aléatoire. En vérifiant, j'ai trouvé des CR, des \n etc … Et si je saute une ligne de trop ou de moins, alors c'est la cata car j'attribuerai une info fausse à mon outil … donc impossible ensuite de faire un tri. Il aurait fallu que je fasse des tests sur CR / LF ou CRLF et je trouvais pas ça forcément plus simple.

                      Du coup, avec ma méthode, je m'affranchis du "sigle" fin de ligne et je mets juste chaque terme dans une cellule de tableau différente (et ça me fait disparaître le problème dess CR ou LF. Ca créait juste le problème supplémentaire de rajouter des cellules en colonne 2 par rapport à la colonne 1. D'où la concaténation, pour ne pas perdre l'info et l'introduction du sigle de reconnaissance.

                      Ensuite, oui, via ce truc du ££, je retombe sur la même logique que toi et je me mets mon n° devant chaque ligne avec ma petite boucle et ma condition if.

                      J'ai ensuite fait différents tests qualité et mon fichier final est bon. (ai quand même trouvé 29 erreurs sur les 6800 lignes, tous dus à des problèmes de formatage).

                      Peut être que dans tout ça, j'ai affabulé. Si j'ai un peu de temps, j'essaiera ta méthode car je suis curieux de voir et puis ça a l'air plus rapide que la mienne.

                      Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

                      • [^] # Re: awk avec précautions

                        Posté par . Évalué à 2.

                        sinon, j'ai pas dit, mais il y a xls2csv qui permet, en ligne de commande de convertir un fichier excel, en fichier csv

                        avec des options qui peuvent te permettre d'avoir le resultat attendu en terme de separateur et de formatage.

                        ensuite tu travailles le CSV que tu viens de generer.

                        • [^] # Re: awk avec précautions

                          Posté par . Évalué à 2.

                          tu peux donner le lien ?
                          je duckduckgoé mais ça donne trop de résultats.

                          • [^] # Re: awk avec précautions

                            Posté par . Évalué à 2.

                            Tu aurais dû apt-cache cherché ;) (j’ai cherché xls2csv)

                            $ apt-cache show catdoc
                            Package: catdoc
                            Version: 1:0.94.3~git20160113.dbc9ec6+dfsg-1
                            Installed-Size: 666
                            Maintainer: Martín Ferrari tincho@debian.org
                            Architecture: amd64
                            Depends: libc6 (>= 2.14)
                            Suggests: tk | wish
                            Description-fr: convertisseur de fichiers Word, Excel et PowerPoint vers du texte brut
                            Le programme catdoc lit un ou plusieurs fichiers Microsoft Word et écrit le
                            texte contenu vers la sortie standard.
                            .
                            Il est maintenant accompagné de xls2csv, un programme convertissant les
                            feuilles de calcul Excel vers un fichiers csv
                            (comma-separated value), et
                            catppt, un outil d'extraction des informations textuelles depuis les
                            fichiers Powerpoint.

              • [^] # Re: awk avec précautions

                Posté par . Évalué à 3.

                le tout sur différentes lignes mais avec un retour chariot si tu veux, ce n'est pas dû à la taille de la celulle

                Fais un export en CSV, si c’est juste qu’il y a des retours à la ligne dans la cellule ça ira bien dans la même « cellule » du fichier CSV, soit en remplaçant les retours à la ligne par des espaces, soit en les conservant et en les échappant, exemple :

                toto;titi;truc sur une ligne;hop
                dédé;jojo;truc\nsur\nplusieur\nlignes;plop

                Pour être plus précis sur « retour chariot » et « fin de ligne », parce que c’est un écueil dans l’informatique…

                « Retour chariot » (CARRIAGE RETURN) et « Saut de ligne » (LINE FEED) sont deux caractères différents. À l’origine ils servaient exactement à ce qu’ils sont censés faire : le premier pour dire à l’imprimante de ramener son chariot au début de la ligne et le second pour dire, toujours à l’imprimante, de faire avancer le papier d’une ligne. Pour un écran d’ordinateur ça n’a plus de sens, donc on utilise l’un de ces caractères pour signifier simplement « fin de ligne ». Et là où c’est magnifique, la source d’un nombre incalculable d’incidents informatiques… pour les fichiers textes :

                Unix/Linux → LF (LINE FEED)
                OSX → CR (CARRIAGE RETURN)
                Windows → CRLF (les deux)

                Et un transfert FTP en mode ASCII peut, à la discrétion du serveur, faire la conversion de ces fins de lignes :)

                C’est vraiment tout con mais j’ai vu tellement d’informaticiens l’ignorer que je n’ai pas écrit tout ceci seulement pour toi :)

    • [^] # Re: awk avec précautions

      Posté par . Évalué à 3.

      Désolé, j'ai un peu fait l'impasse sur la présentation de l'outil.

      Awk est un outil de traitement de données texte tabulaires ligne à ligne.

      Il simplifie l'écriture de script de traitement en préparant le travail :
      * lecture ligne à ligne : chaque ligne passe dans le script.
      * pour chaque ligne, découpage en colonne selon le délimiteur choisi et peuplement dans les variables $1 .. $i .. $n.

      Si tu es amené à faire souvent des traitements de données tabulaires, je t'invite à investir un peu de temps pour lire la documentation, très bien faite, et à pratiquer un peu. L'apprentissage est très rapide car il est facile de raisonner sur un script qui traite une ligne. Les cas courants se font très simplement, avec des scripts courts. Tu gagnera beaucoup de temps par la suite.

      D'un point de vue technique, les traitement sont rapides, souvent limités par la vitesse d'I/O disque, sur des volumétries très importantes (plusieurs GB) avec une consommation de RAM très limitée.

      • [^] # Re: awk avec précautions

        Posté par . Évalué à 2.

        oui merci pour cette présentation. j'ai pas mal bouquiné hier jusqu'à pas d'heure. J'ai en tout cas découvert un bel outil.

        Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

  • # autre solution

    Posté par . Évalué à 1.

    quand on prend un logiciel comme SAP, c'est rarement à nous de nous debrouiller
    il y a un ingenieur, qui est censé vous assister pour la mise en oeuvre et la migration des données.

    evidemment cela a un coup, mais si ca se trouve l'ingé il a des outils pour faire proprement.

    • [^] # Re: autre solution

      Posté par . Évalué à 1.

      figure toi que l'ingénieur en question m'a répondu : "L'IT est allez au bout des ses possibilités techniques".

      Oui … je sais. Moi je suis pas IT, juste un peu geek mais on va dire que j'en sais plus que lui en informatique. Lui, il connaît SAP et Abap, mais apparemment, son cerveau le fait par habitude et non en réfléchissant. Linux pour lui, c'est pas un OS xD

      Bref, sans commentaire en ce qui concerne les consultants (j'ai pas dit qu'il n'y en avait pas des bons, mais la moyenne fait peur).

      Ce n'est pas parce que les choses sont difficiles que nous n'osons pas. C'est parce que nous n'osons pas qu'elles sont difficiles. - Sénéque

      • [^] # Re: autre solution

        Posté par . Évalué à 2.

        Linux pour lui, c'est pas un OS xD

        il doit pouvoir faire ce qu'il veut sans passer par linux,
        excel doit avoir des macros pour ca

        mais chacun ses gouts.

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.