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

  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).

  7. #7
    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
    Citation Envoyé par Laurent Dardenne Voir le message
    Tu peux reformuler, car si on remplace on change qq chose :-)

    Je veux dire qu'au lieu que le fichier comprenne les lignes triées("recuit_pool...") + un tas d'autres lignes(il doit bien y avoir un millier de lignes dans le fichier), il ne reste plus que les lignes récupérés en "recruit_pool..."

  8. #8
    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
    il ne reste plus que les lignes récupérés en "recruit_pool..."
    Dans ce cas supprime ces lignes:
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    else
    {
    Write-Debug "Not found : $_"
    $_
    }

  9. #9
    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
    Citation Envoyé par Laurent Dardenne Voir le message
    Dans ce cas supprime ces lignes:
    Code Powershell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    else
    {
    Write-Debug "Not found : $_"
    $_
    }

    En quoi supprimer la partie Else peut résoudre mon problème?

    Je dois surement mal m'exprimer

    mais je vais résumer, voici un extrait de mon fichier original:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    building equestrian
    {
    	convert_to c_equestrian
    	levels stables knights_stables barons_stables earls_stables kings_stables
    	{
    		stables castle requires factions { byzantium, egypt, france, hre, ireland, poland, portugal, milan, mongols, normans, saxons, scotland, sicily, denmark, spain, venice, united, }
    		{
    			capability
    			{
    recruit_pool "Imladris Noretirno Cavalry"  1   0.06   1  0  requires factions { egypt, }  and region_religion elven 50 and hidden_resource forest or hidden_resource grasland
    recruit_pool "Imladris Noretirno Cavalry"  0   0.025   1  0  requires factions { egypt, }  and region_religion elven 50 and hidden_resource mountains or hidden_resource desert
    
    recruit_pool "Lindon Militia Cavalry"  1   0.06   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource forest or hidden_resource grasland
    recruit_pool "Lindon Militia Cavalry"  0   0.025   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource mountains or hidden_resource desert


    Je souhaiterais qu'il devienne comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    building equestrian
    {
    	convert_to c_equestrian
    	levels stables knights_stables barons_stables earls_stables kings_stables
    	{
    		stables castle requires factions { byzantium, egypt, france, hre, ireland, poland, portugal, milan, mongols, normans, saxons, scotland, sicily, denmark, spain, venice, united, }
    		{
    			capability
    			{
    recruit_pool "Imladris Noretirno Cavalry"  1   0.06   1  0  requires factions { egypt, }  and region_religion elven 50 and hidden_resource forest or hidden_resource grasland
    recruit_pool "Imladris Noretirno Cavalry"  0   0.025   1  0  requires factions { egypt, }  and region_religion elven 50 and hidden_resource mountains or hidden_resource desert
    
    recruit_pool "Lindon Militia Cavalry"  1   0.18   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource forest or hidden_resource grasland
    recruit_pool "Lindon Militia Cavalry"  0   0.075   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource mountains or hidden_resource desert


    Or, avec mon code actuel(voir plus haut), il devient comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    recruit_pool "Lindon Militia Cavalry"  1   0.18   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource forest or hidden_resource grasland
    recruit_pool "Lindon Militia Cavalry"  0   0.075   1  0  requires factions { saxons, }  and region_religion elven 33 and hidden_resource mountains or hidden_resource desert

    Tout le reste du fichier a disparu, il ne remplace pas uniquement les valeurs désirés en conservant le reste du fichier

  10. #10
    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
    Je dois surement mal m'exprimer
    Non, j'ai compris que tu ne voulais que les lignes qui correspondaient à la regex :/

    Citation Envoyé par Dunadan Voir le message
    Or, avec mon code actuel(voir plus haut), il devient comme ceci:
    La regex que tu utilises n'est pas pas celle proposée, elle contient des espaces en trop qui font échouer l'analyse.
    Tu n'as pas adapté le code associé au Else, remplace $_ par $line. C'est ce qui fait que tu ne récupères que les lignes qui 'matchent la regex' :-)

  11. #11
    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
    Citation Envoyé par Laurent Dardenne Voir le message
    Non, j'ai compris que tu ne voulais que les lignes qui correspondaient à la regex :/


    La regex que tu utilises n'est pas pas celle proposée, elle contient des espaces en trop qui font échouer l'analyse.
    Tu n'as pas adapté le code associé au Else, remplace $_ par $line. C'est ce qui fait que tu ne récupères que les lignes qui 'matchent la regex' :-)


    Concernant les espaces, je les ai corrigé dans le $reg et à la sortie pour bien les prendre en compte.

    Et pour le else, j'ai fait les modifications que tu m'as indiqué et cela fonctionne! Merci!

+ 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