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

Scripts/Batch Discussion :

Mise en format de tableaux d'un fichier txt [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut Mise en format de tableaux d'un fichier txt
    Bonjour,

    J'ai un gros fichier texte (7 Mo) avec divers tableaux au format, voici a quoi ça ressemble :

    Nom : Capturevvv.PNG
Affichages : 1864
Taille : 5,1 Ko

    L'idée est faire la récupération de tous les tableaux qui se trouvent dans le fichier texte en ArrayList (tableau).
    Existerait-il un moyen simple avec powershell ?


    En vous remerciant d'avance

  2. #2
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Là tout de suite je ne saurais te répondre mais. As-tu, dans ton fichier, à chaque fois le même nombre de colonnes et surtout un séparateur bien défini par tableau ?

    De plus, ne pourrais-tu pas spliter ton fichier en plusieurs pour avoir plein de "petits fichiers" ne contenant qu'un tableau chacun ?

  3. #3
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut
    Bonjour JeanYvette,

    Non il peut y avoir plusieurs lignes et plusieurs colonnes de taille différentes, le fichier log avec les tableaux dedans sont générés par des recettes DB2 (SQL), il y a chaque fois différente taille.

    Votre idée serait de faire une lecture du fichier (ligne par ligne ?) pour en faire des petits fichiers contenant uniquement les tableaux ?

  4. #4
    Membre très actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2014
    Messages
    261
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Août 2014
    Messages : 261
    Par défaut
    Oui ca serait exactement mon idée, ainsi le script parcourrait des fichiers constitués à 100% de tableaux et ainsi, en fonction du besoin, soit générer un tableau global soit pouvoir adapter à du cas par cas si besoin

    Après pour cette solution, il faut pouvoir distinguer tableau et texte



    Sinon, avez-vous la main sur vos scripts/requêtes SQL qui génèrent les fichiers ? Les modifier/adapter n'est pas imaginable ?

  5. #5
    Membre éprouvé
    Avatar de troxsa
    Inscrit en
    Novembre 2004
    Messages
    388
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Novembre 2004
    Messages : 388
    Par défaut
    Le script (plutôt la requête DB2) génère automatique le log en mettant en forme des tableaux, cela n'est donc pas possible.

    Peut-être que votre idée reste la meilleurs faute de n'avoir rien d'autre

    Donc, lecture du fichier ligne par ligne, je détecte si la ligne contient une "===========" (trim() + split ou replace par ";") supérieure a 2 et je récupérer la ligne de dessus pour avoir le nom des colonnes.
    Puis je fais la lecture des autres lignes jusqu’à a avoir une ligne vide pour avoir un tableau complet.

    c'est complément possible et plutôt facile a faire je pense.
    Qu'en pensez vous ?

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Billets dans le blog
    1
    Par défaut
    Salut,
    Citation Envoyé par troxsa Voir le message
    Qu'en pensez vous ?
    Si tu sais comment déterminer le début et la fin d'un tableau ( le split proposé par JeanYvette) c'est tout à fait possible.
    Le principe suivant, via le pipeline, peut être utilisé :
    Code powershell : 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
     
    Filter Remove-AuthenticodeSignature{
    #([Microsoft.PowerShell.Commands.FileSystemCmdletProviderEncoding] $Encoding="ASCII")
     
     
       function Parse([String] $FileName)
       { #renvoi toutes les lignes sauf celles du bloc de signature
         $isSignatureBloc=$False
         Get-Content -Path $FileName|
         Foreach-Object { 
           switch ($_)  
           {
             "# SIG # Begin signature block"  {$isSignatureBloc=$True;continue}
             "# SIG # End signature block"    {$isSignatureBloc=$False;Continue}
     
             default {
               if ($isSignatureBloc -eq $false)
                  #On traite les lignes qui ne se trouvent pas dans le bloc de signature 
                {$_}
             }#default
          }#Switch
         }#Foreach
       }#Parse
     
     if ($_ )
     {  
       #Récupére un nom de fichier créé par l'OS
      $TempFile = [IO.Path]::GetTempFileName()
      $FullPath=Resolve-Path "$_"
      Write-Debug "$TempFile"
      Write-Debug "$FullPath" 
     
     
       #Extrait toutes les lignes sauf la signature dans un fichier temporaire 
      Parse "$FullPath"|Set-Content "$TempFile"
     
       #Ecrase le fichier d'origine à partir du fichier temporaire
       #$FileInfo.Replace ne fonctionne pas car %Temp% 
       #peut être sur un disque différent de celui de la source :/ 
      Get-Content "$TempFile"|Set-Content "$FullPath" 
      Remove-Item "$TempFile" 
     }
     else {Write-Error "[Remove-AuthenticodeSignature] Ce filtre a reçu une donnée `$null du pipeline."}
    }
    (Un filtre est une fonction ayant uniquement un bloc process, là où une fonction basique n'a qu'un bloc end. Une fonction avancée pouvant implémenter les trois blocs : begin, process et end)

    J'avais crée une fonction d'analyse générique, mais pour des structures ayant un nombre de ligne fixe.
    Envisager peut être un mixte avec Convert-String
    De prime abord je pense qu'il y aura deux passes.

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

Discussions similaires

  1. [AC-2010] Changer le format d'Export d'un fichier txt suite à un programme VBA
    Par dagada75 dans le forum VBA Access
    Réponses: 23
    Dernier message: 17/11/2013, 15h05
  2. remplir tableaux à partir de fichier txt
    Par saedkhella dans le forum Langage
    Réponses: 5
    Dernier message: 14/04/2009, 16h24
  3. format "JMA" colonne d'un fichier TXT
    Par oliver75 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/12/2007, 14h43
  4. Mise à jour d'une table avec un fichier csv
    Par blackangel dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 26/05/2005, 14h46
  5. Mise en place d'un serveur de fichier Samba/RedHat
    Par shaun_the_sheep dans le forum Réseau
    Réponses: 2
    Dernier message: 11/01/2005, 08h22

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