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 :

Modification de certaines valeurs dans un fichier [PowerShell]


Sujet :

Scripts/Batch

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2017
    Messages : 6
    Par défaut Modification de certaines valeurs dans un fichier
    Bonjour,

    J'aurais besoin d'aide, je souhaite modifier les valeurs de certaines lignes d'un fichier mais je ne sais pas comment faire

    Voici le type de lignes en question:

    recruit_pool "Lindon Militia Cavalry" 0 0.035 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource mountains or hidden_resource desert
    recruit_pool "Lindon Militia Swordsmen" 1 0.06 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource forest or hidden_resource grasland


    Les valeurs à modifier sont les valeurs 0.035 et 0.06, je souhaite multiplier chacune de ces valeurs par 3. Évidemment il y a une centaine de lignes de ce genre dans le fichier et les valeurs différent mais garde la même structure, c'est à dire:

    -recruit_pool "nom"
    - une valeur numérique soit egale à 0 soit égale à 1
    - la valeur numérique qui m’intéresse qui est entre 0 et 1


    J'ai un début de code qui permet simplement de récupérer les lignes qui m’intéressent:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    foreach($line in Get-Content "[chemin_fichier]") {
        if ($line -match 'recruit_pool "Lindon*'){
    
        }
    Quelqu'un pourrait m'aider?

  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
    Billets dans le blog
    1
    Par défaut
    Salut,
    une ébauche car je ne suis pas certains de la regex:
    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
     
    $reg='^(recruit_pool ".*") (0|1) (\d{1}.\d{1,}|\d{1,}) (.*)$'
     
    $s=@(
    'recruit_pool "Lindon Militia Cavalry" 0 0.035 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource mountains or hidden_resource desert',
    'recruit_pool "Lindon Militia Swordsmen" 1 0.06 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource forest or hidden_resource grasland',
    '_pool "Lindon Militia Cavalry" 0 0.035 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource mountains or hidden_resource desert',
    'recruit_pool "Lindon Militia Swordsmen" 2 0.06 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource forest or hidden_resource grasland'
    'recruit_pool "Lindon Militia Swordsmen" 1 12 1 0 requires factions { saxons, } and region_religion elven 33 and hidden_resource forest or hidden_resource grasland'
    )
     
    $S|% {
      if ($_ -match $reg)
      {
        $Nb=$matches[3] -as [double]
        Write-Debug "Found: $Nb"
        $new=[string]::Format([System.Globalization.CultureInfo]::GetCultureInfo("en-US"), "{0}", ($nb*3))
        "{0} {1} {2} {3}" -F $matches[1],$matches[2],$new,$matches[4]
      }
      else 
      {
       Write-Debug "Not found : $_"
       $_
      }
    }
    Dans ton cas il faut connaitre toutes les possiblités

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2017
    Messages : 6
    Par défaut
    J'ai parlé trop vite! Dans mon cas ou les lignes doivent être directement remplacé dans le fichiers je ne vois pas comment faire.

    J'ai essayé d'ajouter ton code dans mon foreach mais le script n'a même pas l'air d'essayer de modifier le fichier:


    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
    $reg='^(recruit_pool ".*") (0|1) (\d{1}.\d{1,}|\d{1,}) (.*)$'
     
    foreach($line in Get-Content "[chemin]\test.txt") {
        if ($line -match $reg)
      {
        $Nb=$matches[3] -as [double]
        Write-Debug "Found: $Nb"
        $new=[string]::Format([System.Globalization.CultureInfo]::GetCultureInfo("en-US"), "{0}", ($nb*3))
        "{0} {1} {2} {3}" -F $matches[1],$matches[2],$new,$matches[4]
      }
      else 
      {
       Write-Debug "Not found : $_"
       $_
      }


    Comment l'adapter?
    Merci d'avance

  4. #4
    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
    Citation Envoyé par Dunadan Voir le message
    J'ai essayé d'ajouter ton code dans mon foreach mais le script n'a même pas l'air d'essayer de modifier le fichier:
    Oui car il n'adresse que le pipeline, à toi de créer un filtre (filter ou une fonction) pour enregistrer le résultat.
    Qq chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $T=get-content $file -Raw
    $T|Update-MyNumber|Set-content $file
    
    #OU
    foreach($line in Get-Content "[chemin]\test.txt") {
    
    }|Set-Content $fileNew

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Février 2017
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Février 2017
    Messages : 6
    Par défaut
    Je viens d'essayer en effectuant le Set-Content à la fin du foreach, les lignes triées et modifiées remplacent l'intégralité du fichier:

    Code : 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
    $reg='^(recruit_pool "Lindon.*")  (0|1)   (\d{1}.\d{1,}|\d{1,})   (.*)$'
    
    $(foreach($line in Get-Content "[file]") {
    if ($line -match $reg)
    {
    $Nb=$matches[3] -as [double]
    Write-Debug "Found: $Nb"
    $new=[string]::Format([System.Globalization.CultureInfo]::GetCultureInfo("en-US"), "{0}", ($nb*3))
    "{0} {1} {2} {3}" -F $matches[1],$matches[2],$new,$matches[4]
    }
    else
    {
    Write-Debug "Not found : $_"
    $_
    }
    })|set-content "[file]"
    Comment remplacer les lignes sans rien modifier de la structure complète du fichier?

  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
    Citation Envoyé par Dunadan Voir le message
    Comment remplacer les lignes sans rien modifier de la structure complète du fichier?
    Tu peux reformuler, car si on remplace on change qq chose :-)
    Citation Envoyé par Dunadan
    Voici le type de lignes en question:
    Il y a peut-être un problème d'encodage (asccii/utf8) et/ou de retour chariot (line feed ou line feed+carriage return).

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

Discussions similaires

  1. Réponses: 7
    Dernier message: 19/06/2015, 11h04
  2. Réponses: 6
    Dernier message: 27/03/2012, 15h58
  3. modification d'une valeur dans un fichier txt
    Par oliv27400 dans le forum MATLAB
    Réponses: 5
    Dernier message: 05/12/2011, 20h07
  4. Réponses: 6
    Dernier message: 15/02/2008, 11h10
  5. [DOM XML] Modification de valeur dans un fichier XML
    Par scorpion1611 dans le forum Bibliothèques et frameworks
    Réponses: 17
    Dernier message: 05/09/2007, 14h53

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