3 Replies Latest reply: Oct 11, 2017 4:29 AM by marion dutti RSS

    Chargement et séparation de donnée après chaque ";"

    marion dutti

      Bonjour à tous,

       

      Je charge actuellement des fichiers dans un folder via ce script récupéré sur le forum. Et je doit aussi transformer les données.

       

      - 1er etape chargement données

      - 2 eme étape transformation

       

      1er etape via ce script

       

      set Concatenate=; // used to insert concatenate in load statement after the first file loaded

      // subroutine

      sub ScanFolder(Root)

      for each Ext in '*.txt' // use this to identify file names to load

      //for each Ext in 'txt' // or simply indicate an extension types to load

      for each FoundFile in filelist(Root & '\*' & Ext)

      FileList: // don't worry about the squigly lines.  they are there because of the concatenate variable.  will run fine.

      $(Concatenate)

      load *

      from [$(FoundFile)](txt, utf8, no labels, delimiter is '\t', msq, no eof); // parameters here might change depending on the files you are loading

       

      set Concatenate = concatenate;

      next FoundFile

      next Ext

       

      for each SubDirectory in dirlist(Root&'\*')

      call ScanFolder(SubDirectory)

      next SubDirectory

      end Sub

       

      // place the root directory you want to cycle through here.

      Call ScanFolder('.....');

       

      Les données sont dans une table avec FileList avec un champ @1.

       

      2 eme étape : transformation.

       

      Or les données ont ce format par exemple sans en tête.

      20170929;0312;4040000000D93086;111

       

      Que je transforme via ce script:

      LOAD *

      From_Field (FileList,data)

      (txt, utf8, explicit labels, delimiter is ';', no quotes);

       

      Mais j'aimerais avoir le nom du fichier d'origine répété pour chacune des lignes avec les données bien splittées.

      Ex fichier

      nom fichier         code1            code2     code3                                 code4

      toto1                    20170929    0312      4040000000D93086            111


      Pense qui faudrait faire ce travail directement lors du chargement  plutôt qu'en deux étapes? Mais je vois pas comment?

       

      Merci d'avance.

        • Re: Chargement et séparation de donnée après chaque ";"
          Martin Sorel

          Bonjour,

          Si les fichiers ont tous le même format, l'étape de transformation peut être fait directement dans la boucle de chargement de la routine ScanFolder ; La deuxième étape n'est pas nécessaire.

           

          Dans la routine chargement, il faudrait donc:

          -Spécifier les bonnes propriétés des fichiers sources (encodage, séparateur...)

          -Ajouter une fonction pour récupérer le nom du fichier (FileBaseName(), FilePath()...).

           

          Ce qui donnerait quelque chose comme:

          $(Concatenate)

          load * ,

          FileBaseName() as [nom fichier]

          from [$(FoundFile)](txt, utf8, explicit labels, delimiter is ';', no quotes);

           

          A noter également, si tous les fichiers sont dans le même dossiers (pas de sous dossiers), il n'y a pas besoin de la boucle récursive et le script peut etre simplifié.

           

          Martin

            • Re: Chargement et séparation de donnée après chaque ";"
              marion dutti

              Salut martin,

               

              Merci pour ton aide,

               

              Juste une précision. Pour la boucle récursive, j'ai essayé de l’alléger mais je vois pas ce que je peux enlever sans faire planter le lancement?

               

              Martin Sorel <span class="icon-status-icon icon-partner" title="Partner"></span> a écrit:

               

               

              A noter également, si tous les fichiers sont dans le même dossiers (pas de sous dossiers), il n'y a pas besoin de la boucle récursive et le script peut etre simplifié.

               

              Martin

              Pour la partie séparation des données dans la boucle cela fonctionne parfait.

               

              Juste une précision j'ai pas tous les champs qui sont séparés correctement dans ma ligne pour chaque  ";"


              Alors que lorsque je traitais les données aprés coup j'avais bien une colonne pour chaque élément de la ligne.


              Exemple :

              nom fichier         code1            code2     code3                        code4

              toto1                    20170929    0312      8004                            120


              La j'ai bien les 3 premiers codes mais j'ai pas le code 4 par exemple, surtout que je dois avoir une dizaine d'éléments séparés par une ";" après qui n’apparaissent pas.



              Merci par avance et bonne soirée.