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 :

Récupérer une partie du texte entre deux chaînes de caractères connues 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 averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2015
    Messages : 52
    Par défaut Récupérer une partie du texte entre deux chaînes de caractères connues d'un fichier txt
    Bonjour,

    Je cherche à récupérer une partie du texte contenu dans un fichier toto.txt et le coller dans un fichier titi.txt grâce à un script en Powershell
    Ce texte à récupérer est au milieu du fichier et pas toujours aux mêmes coordonnées de lignes mais je connais les chaines de caractères qui le préccède et le succède.

    Fichier toto.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    blabla1
    blabla2debutblabla3
    blabla4
    blabla5
    blabla6
    blabla7finblabla8
    blabla9
    et je souhaite obtenir titi.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    blabla3
    blabla4
    blabla5
    blabla6
    blabla7
    Je pensais faire ça en deux étapes avec Select-String mais je ne sais pas comment dire "fin du fichier" et "début de fichier" dans -Context
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Select-String -Path 'C:\temp\toto.txt' -Pattern "début" -Context 0, fin du fichier | Out-File 'C:\temp\tmp.txt'
    Select-String -Path 'C:\temp\tmp.txt' -Pattern "fin" -Context début du fichier, 0 | Out-File 'C:\temp\titi.txt'

    Je ne suis peut être pas sur la bonne piste... mais j'imagine que ça doit être simple mais je n'arrive pas à trouver.

    Merci d'avance pour vos pistes et/ou solutions.

  2. #2
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2015
    Messages : 52
    Par défaut
    J'ai finalement trouvé une solution en faisant comme ça:

    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
    #Ajoute un saut de ligne avant et après debut et fin
    Get-Content 'C:\temp\toto.txt' | foreach { $_ -replace "debut", "`n debut `n"} | Out-File 'C:\temp\tmp1.txt'
    Get-Content 'C:\temp\tmp1.txt' | foreach { $_ -replace "fin", "`n fin `n"} | Out-File 'C:\temp\tmp2.txt'
    #Supprime les lignes vides
    Get-Content 'C:\temp\tmp2.txt'  | ? {$_.trim() -ne "" } | Out-File 'C:\temp\tmp1.txt'
     
    #Cherche numéro de ligne contenant "debut"
    $NbLigneDebut = Select-String -Path 'C:\temp\tmp1.txt' -Pattern "debut"
    $NbLigneDebut = $NbLigneDebut[0].LineNumber
    #Cherche numéro de ligne contenant "fin"
    $NbLigneFin = Select-String -Path 'C:\temp\tmp1.txt' -Pattern "fin"
    $NbLigneFin = $NbLigneFin[0].LineNumber
     
    #Crée le fichier titi.txt ligne par ligne (La première ligne d'un fichier avec -Index est 0, du coup pas la peine de faire +1 à $NbLigneDebut pour démarrer)
    Do {
        Get-Content -Path 'C:\temp\tmp1.txt' | Select-Object -Index ($NbLigneDebut) | Add-content -path 'C:\temp\titi.txt' 
        $NbLigneDebut++ 
    } Until ($NbLigneDebut -eq $NbLigneFin - 1)
     
    #Supprime fichiers temporaires
    Remove-Item -Path 'C:\temp\tmp1.txt'
    Remove-Item -Path 'C:\temp\tmp2.txt'

    Je suis sûr qu'il doit y avoir plus simple et propre en moins tordu... pour faire un truc aussi basic...

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 218
    Par défaut
    C'est l'enfer ton truc, voici d'autres propositions :

    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # avec Replace
    (Get-Content -Path "toto.txt" -Raw) -replace '(?smi)(?:.*debut)(.*)(?:fin.*)', '$1' | Set-Content "titi1.txt"
     
    # avec IndexOf
    $content = Get-Content -Path "toto.txt" -Raw
    $start = "debut"
    $end = "fin"
    $content.Substring($content.IndexOf($start) + $start.Length, $content.IndexOf($end) - $content.IndexOf($start) - $start.Length) | Set-Content "titi2.txt"
     
    # avec Split
    (($content -split "debut")[1] -split "fin")[0] | Set-Content "titi3.txt"

  4. #4
    Membre averti
    Homme Profil pro
    Technicien maintenance
    Inscrit en
    Mars 2015
    Messages
    52
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Technicien maintenance

    Informations forums :
    Inscription : Mars 2015
    Messages : 52
    Par défaut
    Nickel. Merci.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 03/07/2018, 15h59
  2. [Débutant] Prendre une chaine de texte entre deux balises d'un code source.
    Par megavigore33 dans le forum VB.NET
    Réponses: 7
    Dernier message: 09/12/2014, 23h05
  3. [RegEx] Récupérer du texte entre deux chaines de caractères
    Par Globolite dans le forum Langage
    Réponses: 3
    Dernier message: 10/07/2014, 16h38
  4. Récupérer une partie du texte d'un fichier php
    Par dercom dans le forum Langage
    Réponses: 6
    Dernier message: 29/12/2011, 23h23
  5. Réponses: 4
    Dernier message: 07/06/2007, 22h35

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