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 :

Script pour fusionner deux fichiers textes avec une certaine complexité !


Sujet :

Scripts/Batch

  1. #1
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Script pour fusionner deux fichiers textes avec une certaine complexité !
    Bonjour,

    J'aimerais fusionner deux fichiers texte jusque-là tout va bien, la spécificité est que j'ai un fichier GÉNÉRAL et un fichier AUXILIAIRE qui sont modulable.

    La générale contient par exemple :

    Variables GENERALE.txt.

    L'auxiliaire contient les chaînes que je veux remplacer dans la générale, mais qui n'ont pas les mêmes valeurs de configuration (camerafollow=1 dans l'auxiliaire, camerafollow=0 dans la générale) :

    Variables AUX.txt.

    Alors, j'aimerais que l'auxiliaire s'incrémente dans la générale sans créer de doublon.

    ex : camerafollow=1 et plus bas camerafollow=0 c'est non ça !

    Le fichier auxiliaire n'est pas statique et se modifie souvent, je ne peux donc pas faire un script avec écrit les chaînes spécifiques que je veux remplacer,

    Il me faut donc un script qui recherche les chaînes du fichier auxiliaire et les utiliser pour remplacer une par une cette chaîne dans la générale.

    Voilà mon problème !

    Je suis sous windows, powershell ou batch(si possible)

    Merci d'avance je craque !

  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,
    regarde cette fonction.
    La méthode Regex.Replace peut exécuter du code lorsqu'elle trouve une occurrence recherchée. Avec une variable $Compteur de portée globale cela me semble possible.
    Donne nous des exemples avant le traitement et après le traitement.




  3. #3
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour,

    Alors je suis un peu novice en powershell donc je suis un peu perdu dans ton script comment faut t'il que je m'y prenne pour utilisé ta fonction proposé ?


    Pour l'exemple voici mon générale :
    gigi=12
    jojo=24
    kiki=4
    toto=1
    tata=3
    titi=6


    Mon Auxiliaire :

    toto=0
    tata=9
    titi=2
    vivi=89
    vava=54

    Je veut que l'auxiliaire s'ajoute au générale et remplace de par ailleurs l'existant avec cet nouvelle valeur.

    Mon générale souhaiter après l'application du script :

    gigi=12
    jojo=24
    kiki=4
    toto=0
    tata=9
    titi=2
    vivi=89
    vava=54

  4. #4
    Expert éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

    je tombe un peu par hasard sur la discussion; est-ce que l'ordre des lignes importe ?
    est-ce qu'on peut considérer en prenant les choses dans l'autre sens que le but est de reprendre le contenu du fichier auxiliaire.txt puis de ne prendre dans le fichier general.txt que les lignes dont la clé (clé=valeur) n'existait pas dans le fichier précédent ?

    auquel cas (je ne code pour ainsi dire jamais en PowerShell, excusez donc si c'est dégueu) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $tab = @()
    
    ForEach ($line in Get-Content "auxiliaire.txt") {
    	Write-Host $line
    	$tab += $line.split("=")[0]
    }
    
    ForEach ($line in Get-Content "general.txt") {
    	If ($tab -notcontains $line.split("=")[0]) {
    		Write-Host $line
    	}
    }

  5. #5
    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
    Citation Envoyé par BufferBob Voir le message
    est-ce qu'on peut considérer en prenant les choses dans l'autre sens que le but est de reprendre le contenu du fichier auxiliaire.txt puis de ne prendre dans le fichier general.txt que les lignes dont la clé (clé=valeur) n'existait pas dans le fichier précédent ?
    De considérer des ensembles peut simplifier effectivement, dans ce cas l'usage d'un hashset peut être envisagé.

  6. #6
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Hello,

    personnellement je ferais un petit batch :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    @echo off
    
    ::On set toutes les valeurs du premier fichier  comme variable d'environnements
    
    for /f "delims=" %%a in ('type "Variables GENERALE.txt"') do set ##%%a
    
    ::On fait la même chose avec le 2éme fichier (ce qui assignera la bonne valeur au var déjà existante et créra les manquantes)
    
    for /f "delims=" %%a in ('type "Variables AUX.txt"') do set ##%%a
    
    ::On écrit toutes les variables ## dans un fichier de sortie
    
    (for /f "delims=" %%a in ('set ##') do echo %%a) > Out.txt
    Simple rapide et efficace !

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  7. #7
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut BufferBob
    Bonjour,

    Effectivement je n'y avais pas penser !

    Le ligne de code que tu m'a fourni m'affiche bien dans la console powershell le résultat voulu !

    est t'il possible d'avoir ce résultat dans un fichier resultat.txt ?

    J’essaie tant bien que mal mais je n'y arrive pas !

  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
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par sachadee Voir le message
    Simple rapide et efficace !
    C'est concis !
    N'ayant pas fait de batch depuis un bout de temps ça reste hermétique sans explications :/
    Vérifie toutefois le résultat, j'ai un doute sur : ##toto=1 devrait être ##toto=0 ?

    Une solution en PS :
    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
    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
    @'
    gigi=12
    jojo=24
    kiki=4
    toto=1
    tata=3
    titi=6
    '@ > 'c:\temp\Generale.txt'
    
    @'
    toto=0
    tata=9
    titi=2
    vivi=89
    vava=54
    '@ > 'c:\temp\Auxiliaire.txt'
    
    
    #Requires -version 3
    
    
    Function New-VariableText{
     param(
        [Parameter(Mandatory=$True,position=0)]
       $Line
     )
      $o=[pscustomobject]@{
        PSTypeName='VariableText';
        Key=($Line -split '=')[0]
        Line=$Line;
       }
      $O|Add-Member -Force -MemberType ScriptMethod -Name ToString -Value {$this.Line} -pass
    }# New-VariableText
    
    $Auxiliaire=gc 'c:\temp\Auxiliaire.txt'|% { New-VariableText -Line $_}
    $Generale=gc 'c:\temp\Generale.txt'|% { New-VariableText -Line $_}
    
    Compare-Object $Generale $Auxiliaire -Property Key -PassThru|
     Where-Object {$_.SideIndicator -eq  '<=' }|
     Foreach-Object {$_.Line}
    Reste à construire le fichier finale ( ajout des lignes issues du compare).
    Du coup PS apparait bien verbeux

  9. #9
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bon je garde le powershell sous le coude, c'est pour des utilisateurs lamba du coup c'est plus facile pour eux de l'éxecuter qu'un powershell...

    Le bat créer bien le résultat mais avec ## a chaque début de ligne.

    J'ai donc éliminer les 2 premier caractères de chaque ligne c'est dégeulasse mais sa fonctionne nickel !

    Voila le code :

    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
    17
    18
    19
    @echo off
    
    ::On set toutes les valeurs du premier fichier  comme variable d'environnements
    
    for /f "delims=" %%a in ('type "GENERAL.txt"') do set ##%%a
    
    ::On fait la même chose avec le 2éme fichier (ce qui assignera la bonne valeur au var déjà existante et créra les manquantes)
    
    for /f "delims=" %%a in ('type "AUXILIAIRE.txt"') do set ##%%a
    
    ::On écrit toutes les variables ## dans un fichier de sortie
    
    (for /f "delims=" %%a in ('set ##') do echo %%a) > Out.txt
    
    SETLOCAL enabledelayedexpansion
    FOR /F "tokens=*" %%m in (Out.txt) Do (
    set variable=%%m 
    echo !variable:~2!>>resultat.txt
    )



    Et bien vous m'avez retiré une sacrée épine du pied la !

    Je vous remercie vraiment !

  10. #10
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Effectivement j'ai oublié les 2 premiers caractères

    Retire les directement dans la dernière boucle et en utilisant simplement le "delims=##":

    Code bAT : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    @echo off
    setlocal enabledelayedexpansion
     
        for /f "delims=" %%a in ('type "Variables GENERALE.txt"') do set ##%%a
        for /f "delims=" %%a in ('type "Variables AUX.txt"') do set ##%%a
     
    (for /f "delims=##" %%a in ('set ##') do echo %%a) > Resultat.txt

    ça sera un peu moins dégeu....

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

  11. #11
    Candidat au Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Mai 2014
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Alors j'observe que dans mon fichier AUXILIAIRE les valeurs complètes qui n'existe pas du tout dans le GENERAL ne sont pas créer dans mon resultat.txt.

    Je m'explique :

    GÉNÉRALE :

    gigi=12
    jojo=24
    kiki=4


    AUXILIAIRE :

    gigi=6
    jojo=13
    kiki=9
    YOUPI=14


    Résultat.txt :

    gigi=6
    jojo=13
    kiki=9


    Il me manque YOUPI=14 ...

  12. #12
    Membre expert
    Avatar de sachadee
    Homme Profil pro
    AMI DU BAT
    Inscrit en
    Janvier 2013
    Messages
    1 478
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Brésil

    Informations professionnelles :
    Activité : AMI DU BAT
    Secteur : Distribution

    Informations forums :
    Inscription : Janvier 2013
    Messages : 1 478
    Points : 3 768
    Points
    3 768
    Par défaut
    Je viens de tester avec le dernier code que jài posté.

    ca marche nickel.

    Controle peut-etre le nom des fichiers.

    ________________________________
    Un p'tit coup de pouce ça fait toujours plaisir, pensez-y !
    ________________________________

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

Discussions similaires

  1. comparaison de deux fichiers textes avec un script python
    Par zekruss dans le forum Général Python
    Réponses: 1
    Dernier message: 10/11/2009, 05h52
  2. Possibilité de compilation de fichiers texte avec une macro
    Par Tinien dans le forum Macros et VBA Excel
    Réponses: 27
    Dernier message: 27/10/2008, 22h15
  3. Réponses: 2
    Dernier message: 16/05/2008, 11h49
  4. Script pour vider deux fichier logs
    Par Le sicilien dans le forum Shell et commandes GNU
    Réponses: 7
    Dernier message: 09/05/2008, 07h58
  5. Comment parcourir un fichier texte avec une boucle ?
    Par kikica dans le forum Langage
    Réponses: 2
    Dernier message: 15/11/2005, 17h13

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