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 :

Remplacement contenu de fichier par regex [PowerShell]


Sujet :

Scripts/Batch

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut Remplacement contenu de fichier par regex
    Bonjour à tous,

    J'ai des ficiers CSV (séparateur ";") où j'ai une ou plusieurs colonnes contenant des dates au format YYYY-MM-DD et je souhaiterai les convertir toutes en DD/MM/YYYY.

    J'ai trouvé la regex suivante (';[0-9]{4}-[0-9]{2}-[0-9]{2};') qui correspond à mon besoin, mais je n'arrive pas à l'utiliser dans mon exemple.

    2 problèmes que je rencontre :
    1/ La regex fonction avec une ligne stockée dans une variable :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $test = '11111;AAA;ABCDEFGJIJ KLMNOPQRST UVWXYZ123         ;2099-12-31;'
    [Regex]::Replace($test,';[0-9]{4}-[0-9]{2}-[0-9]{2};',';nouvelle date;')
    11111;AAA;ABCDEFGJIJ KLMNOPQRST UVWXYZ123         ;nouvelle date;

    J'ai bien nouvelle date à la place de DD/MM/YYYY.

    Par contre si je fais pour un fichier en entier, cela ne fait rien :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $file = Get-Content .\fichier.csv
    [Regex]::Replace($file,';[0-9]{4}-[0-9]{2}-[0-9]{2};',';nouvelle date;')

    2/ Je souhaiterai remplacer dans ma regex ';nouvelle date;' par ';DD/MM/YYYY;' en réutilisant les valeurs trouvées précédemment.

    Je suis un peu perdu.
    Si vous pouviez m'aider ou me donner des exemples pour que je comprenne.

    En vous remerciant...

    misterg94

  2. #2
    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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    il faut utilser des groupes de capture afin de pouvoir les réutilser par leur numéro :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $test -match '^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});'
    $matches 
     
    $Test
    [Regex]::Replace($test,'^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});','$1;$4/$3/$2;'
    Pour l'autre question, utilise une boucle
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Get-Content .\fichier.csv|
     Foreach-object {
      [Regex]::Replace($_,'^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});','$1;$4/$3/$2;'
    }|Set-content Newfile.csv
    Ici c'est juste le principe, pas de gestion d'erreur , ni de l'encodage, ni de la location du répertoire, etc.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Bon j'ai écris ça, mais ya peut-être une meilleur solution.
    Si quelqu'un a une idée je suis preneur.


    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
    $Files = Get-ChildItem -recurse -path $DesktopDir -Filter 'file_*.csv'
    $Files
     
    foreach ($CSV in $Files)
    {
        $Index++
        $NameCSV = $CSV.FullName
        $NewNameCSV = "$($CSV.DirectoryName)\CSV\$($CSV.Name.Split("_")[2]).csv"
     
        $file = Get-Content $NameCSV | foreach{
            $line = $_
     
            $reg = $true
            while($reg -eq $true)
            {
                $reg = $line -match ';([0-9]{4})-([0-9]{2})-([0-9]{2});'
                $line = [Regex]::Replace($line,';([0-9]{4})-([0-9]{2})-([0-9]{2});',';$3/$2/$1;')
            }
     
            $_ = $line
            $_
        }
        Set-Content $file -Path $NewNameCSV -Force
        Remove-Item $NameCSV
    }

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Citation Envoyé par Laurent Dardenne Voir le message
    Salut,
    il faut utilser des groupes de capture afin de pouvoir les réutilser par leur numéro :
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $test -match '^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});'
    $matches 
     
    $Test
    [Regex]::Replace($test,'^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});','$1;$4/$3/$2;'
    Pour l'autre question, utilise une boucle
    Code powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
     
    Get-Content .\fichier.csv|
     Foreach-object {
      [Regex]::Replace($_,'^(.*?);([0-9]{4})-([0-9]{2})-([0-9]{2});','$1;$4/$3/$2;'
    }|Set-content Newfile.csv
    Ici c'est juste le principe, pas de gestion d'erreur , ni de l'encodage, ni de la location du répertoire, etc.
    A super merci Laurent !
    En effet, j'avais trouvé entre temps pour les groupes, mais j'avais fait une boucle while pour mon deuxième problème.

    Merci encore !

  5. #5
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    J'aborderais le problème différemment.

    Tu as un csv tu fait un Import-Csv
    Tu as une date au format string utilise Datetime.TryParse ou DateTime.Parse
    Tu veux la convertir en un format spécifique utilise ToString

    Je pourrais te donner un exemple mais il faudrait savoir si le fichier csv possède des en-têtes et leur nom.

    Si tu souhaite vraiment utiliser une regex, le mieux serais de lire le fichier avec le paramètre Raw (afin d'obtenir une chaine de caractère et pas un tableau de ligne) et de spécifier, avec le préfixe (?ms), que ta regex est de type multiline.
    https://www.apharmony.com/software-s...in-powershell/

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    J’avais pensé à l’import-csv, le problème c’est que j’ai différents types de fichier avec des formats différents aussi. Du coup je cherche une façon de faire qui fonctionne pour tous les fichiers.

    Je vais regarder ce que tu m’as donné.

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    j’ai différents types de fichier avec des formats différents aussi. Du coup je cherche une façon de faire qui fonctionne pour tous les fichiers
    Chaque fichier ayant une structure différente requière une analyse différente, tu devra au minima adapter ton pattern

    Envoi ton ou tes fichiers sinon que l'on voit

  8. #8
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2008
    Messages
    23
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2008
    Messages : 23
    Points : 15
    Points
    15
    Par défaut
    Voici la proposition qui m'a été faite et qui fonctionne très bien :
    Code PowerShell : Sélectionner tout - Visualiser dans une fenêtre à part
    (Get-Content $CurrentCSVFile.FullName) -replace "(\d{4})-(\d{2})-(\d{2})", '$3/$2/$1' | Out-File -FilePath $OutputCSVFile

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 184
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    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 184
    Points : 5 755
    Points
    5 755
    Par défaut
    Tu peux passer le sujet en résolu

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

Discussions similaires

  1. Ajouter contenu fichier par ligne
    Par seekawa dans le forum Programmation et administration système
    Réponses: 4
    Dernier message: 20/04/2014, 17h22
  2. remplacer include par le contenu du fichier appelé
    Par Celano dans le forum Mise en forme
    Réponses: 13
    Dernier message: 21/07/2012, 23h13
  3. Vérifier par RegEx un nom de fichier
    Par ToniConti dans le forum Pentaho
    Réponses: 2
    Dernier message: 19/10/2010, 16h10
  4. Réponses: 5
    Dernier message: 21/04/2010, 21h41
  5. Envoie du contenu d'un fichier par rmi
    Par Gmrinfo dans le forum Entrée/Sortie
    Réponses: 1
    Dernier message: 19/06/2008, 22h52

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