Question [Résolu]Modification fichier texte

Plus d'informations
il y a 9 ans 4 mois #22580 par jeffdu62
Bonjour à tous.

tout d'abord merci de m'avoir aider sur mon premier ce qui m'as permis de bien me débloquer.

Je suis sur la fin de mon script et je bloque sur une étape.

mon script doit modifier un fichier de type txt à partir d'un autre fichier.

Exemple :

fichier_ori.txt posséde la ligne toto=titi
fichier_modif.tct possède la ligne toto=tata

le but donc du script est que dans le fichier_ori.txt toto=tata mais sans que cela ne modifie le reste du fichier.

j'ai déjà un but de script pour ajouter une donnée mais pour modifier je sèche complètement malgré que j'ai regardé sur le forum, les tutos et le livre j'y arrive pas.

j'en suis arrivé à ca ( la boucle fonctionne meme si c'est pas propre)

[code:1]$properties=\"C:\Users\Desktop\TEST\\"
$properties_a_modifier=\"C:\Users\Desktop\TEST\PROPERTIES_A_MODIFIER_WINDOWS\"
$temp=\"tmp.txt\"
#on recupère le nom du fichier à modifier :

$nom_fichier= Get-ChildItem $properties_a_modifier |select Name

#on boucle sur chaque fichier présent dans le dossier

foreach ($i in $nom_fichier){
cd $properties_a_modifier
$nom=$i.name
Write-Host \"Nom du fichier à modifier :\" $nom
$modify=Get-Content $nom
#On boucle sur le contenu du fichier
foreach ($j in $modify){
cd $properties
#on liste le contenu du fichier à modifier et on remplace le contenu des lignes que l'on met dans un fihcier temporaire

$modification=Get-Content $nom |foreach { $_ -replace \"$nom\",\"$j\" } |Set-Content $temp
$donnee=get-content $temp
#réécriture dans le fichier d'origine
set-content $nom $donnee
}
}[/code:1]

une idée, un indice qui pourrait me débloquer?
EDIT: je met le code que je viens de modifier, là ou je bloque c'est comment récupérer la valuer avant le = aifn d'essayer de le trouver dans le fichier à modifier.
Merci

Message édité par: hutre, à: 7/11/16 11:28<br><br>Message édité par: hutre, à: 1/12/16 16:42

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 4 mois #22601 par jeffdu62
Réponse de jeffdu62 sur le sujet Re:Modification fichier texte
j'ai un peu avancé sur mon problème :

j’utilise import-csv afin de pouvoir jouer avec les données.

j’arrive bien à modifier les données :

ci-dessous le script en question :
[code:1]$properties=\&quot;C:\Users\Desktop\TEST\\&quot;
$properties_a_modifier=\&quot;C:\Users\Desktop\TEST\PROPERTIES_A_MODIFIER_WINDOWS\&quot;
$temp=\&quot;result.properties\&quot;
$nom_fichier= Get-ChildItem $properties_a_modifier
foreach ($nom in $nom_fichier.name){
#on importe les fichiers properties avec import-csv
cd $properties_a_modifier
$properties_modif=Import-Csv $nom -Delimiter '=' -header ('avant','apres')
cd $properties
properties_ori=Import-Csv $nom -Delimiter '=' -header ('avant','apres')
#on boucle sur chaque élément du tableau crée avec import-csv
foreach ($i in $properties_ori){
foreach ($j in $properties_modif){
if ($i.avant -eq $j.avant)
{

$i.apres=$j.apres
$ini=$properties_ori|Export-Csv $temp -Delimiter = -NoTypeInformation|ft -HideTableHeader

}
}
}
}[/code:1]

le problème que j'arrive pas à solutionner pour le moment :

dans le fichier tmp j'ai mes résultats sous la forme :

@{avant=titi; apres=frff }
@{avant=tutu; apres=grapouille}
@{avant=totp; apres=cvfred}
@{avant=blabla; apres=toto}

alors que j'aimerai les avoir sous la forme :

titi=frff
tutu=grapouille

etc

une piste qui pourrait me conduite à la finalisation?

EDIT: j'arrive maintenant à afficher un résultat plus ou moins correct
\&quot;avant\&quot;,\&quot;apres\&quot;
\&quot;titi\&quot;,\&quot;frff \&quot;
\&quot;tutu\&quot;,\&quot;grapouille\&quot;
\&quot;totp\&quot;,\&quot;cvfred\&quot;
\&quot;blabla\&quot;,\&quot;toto\&quot;

me reste à supprimer les \&quot;\&quot; saudf que je peux pas faire un replace car il peut avoir ce caractère dans apres
merci<br><br>Message édité par: hutre, à: 10/11/16 11:58

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 4 mois #22602 par jeffdu62
Réponse de jeffdu62 sur le sujet Re:Modification fichier texte
Enfin, j'ai trouvé.
meme si ce n'est pas tres beau, il fait ce que je souhaite et ca me débloque :

[code:1]$properties=\&quot;C:\Users\Desktop\TEST\\&quot;
$properties_a_modifier=\&quot;C:\Users\Desktop\TEST\PROPERTIES_A_MODIFIER_WINDOWS\&quot;
$nom_fichier= Get-ChildItem $properties_a_modifier
foreach ($nom in $nom_fichier.name){
#on importe les fichiers properties avec import-csv
cd $properties_a_modifier
$properties_modif=Import-Csv $nom -Delimiter '=' -header ('avant','apres')
cd $properties
$properties_ori=Import-Csv $nom -Delimiter '=' -header ('avant','apres')
#on boucle sur chaque élément du tableau crée avec import-csv
foreach ($i in $properties_ori){
foreach ($j in $properties_modif){
if ($i.avant -eq $j.avant)
{
$i.apres=$j.apres
# on exporte les résultat dans un fichier.
$ini=$properties_ori|Export-Csv polop -Delimiter \&quot;=\&quot; -NoTypeInformation|ft -HideTableHeaders

}
}
}
}
# on modifie le fichier avec les informations de la boucle.

$resultat=get-content polop |foreach {$_ -replace '\&quot;',''}|Set-Content $nom[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 4 mois #22622 par jeffdu62
Réponse de jeffdu62 sur le sujet Re:Modification fichier texte
le script précédent ajoute des caractères sur toutes les lignes et cela ne va donc pas.

Apres plusieurs tests et recherches, je suis tombé sur une solution qui fonctionne et en plus le code est quand meme plus propre :)

je vous le met ici des fois que celui intéresserais quelqu'un un jour

[code:1]$modif=\&quot;C:\Users\Desktop\TEST\PROPERTIES_A_MODIFIER_WINDOWS\&quot;
$content=Get-ChildItem $modif
[String]$temp=\&quot;C:\users\Desktop\TEST\temp.txt\&quot;

foreach($fic in $content)
{
cd $modif
write-host \&quot;contenu:\&quot; $content
[int]$valeur=0

[String]$in=\&quot;C:\users\desktop\TEST\$fic\&quot;
[String[]]$test=Get-Content $in
[string[]]$test2=get-content $fic
$import=Import-Csv $fic -Delimiter \&quot;=\&quot; -Header ( 'modif','amodif')
$import2=Import-Csv $in -Delimiter \&quot;=\&quot; -Header ( 'modif','amodif')


foreach ($line2 in $import2)
{
[int]$valeur2=0
foreach ($line in $import)
{

if ($import[$valeur2].modif -eq $import2[$valeur].modif)
{

$test=$test -replace ($test[$valeur],$test2[$valeur2])
}

$valeur2++
}
$valeur++
$test &gt; $temp
}

}[/code:1]

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 4 mois #22625 par Philippe
Réponse de Philippe sur le sujet Re:Modification fichier texte
salut hutre

je suis heureux que tu puisse avancé seul sur ce sujet
j'ai essayé plusieurs fois de te répondre mais le travaille m'a rattrapé a chaque fois :blush: et je m'efforce de ne pas ramené d'activité informatique à la maison :whistle:

pour répondre à ta demande il n'y a pas de réponse simple, ou plutôt pas de commande prevue pour ce cas
il te faut donc créé un script en fonction de ta situation
et il y a plusieurs solution possible ! tu en a trouvé une, j'ai n'ai trouvé une autre, et un autre utilisera une autre façon de faire :evil:

le script précédent ajoute des caractères sur toutes les lignes et cela ne va donc pas.

sans vouloir faire une critique, ton precedent script ne faisais pas ce que tu demandé :(

Apres plusieurs tests et recherches, je suis tombé sur une solution qui fonctionne et en plus le code est quand meme plus propre

dans tes codes que tu donne j'ai du mal a trouvé quel est le fichier modifier et quel est le fichier avec les modif a faire
et dernier remarque désagréable, dans ton dernier code il manque l'enregistrement de tes modif

voila un script repris du tiens mais qui utilise une autre technique :
[code:1]# dossier avec le fichier contenant les modifs à faire
$properties = \&quot;C:\Users\Desktop\TEST\modif de propriété a effecttuer.txt\&quot;
# dossier avec les fichiers à modifié; on peut indiqué un fichier ou un dossier avec plusieurs fichiers a modifier
$properties_a_modifier = \&quot;C:\Users\Desktop\TEST\fichier à modifier.txt\&quot;

# on importe le fichier fichiers contenant les modifs à faire
$modif = Get-Content $properties | ConvertFrom-String -Delimiter '=' -PropertyNames avant,apres
$nom_fichier = Get-ChildItem $properties_a_modifier
foreach ($nom in $nom_fichier.fullname) { # on selectionne un fichier
# cd $properties_a_modifier ############ si on utilise la propiété fullname sur la ligne precedeante, le changement de dossier est inutile !!!
# on importe les fichiers properties
$properties_ori = Get-Content $nom
$dest = @()
# on boucle sur chaque élément du tableau crée avec import-csv
foreach ($ligne in $properties_ori) {
$i = $ligne -split \&quot;=\&quot;
foreach ($j in $modif) {
if ($i[0] -eq $j.avant) {
$i[1] = $j.apres
# on exporte les résultat dans un fichier.
}
}
$dest += \&quot;$($i[0])=$($i[1])\&quot;
}
# on enregistre le fichier avec les informations modifer.
$dest | Set-Content \&quot;C:\polop.txt\&quot; ##### changé le nom du fichier destination par : $nom
}
[/code:1]

n'hésite pas a revenir nous posé des questions et a répondre a au autres sujets si tu pense avoir la solution ;)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.052 secondes
Propulsé par Kunena