Question
Modification de caractères à la volée
- Meloo
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
Réduire
Plus d'informations
- Messages : 1
- Remerciements reçus 0
il y a 13 ans 11 mois #11383
par Meloo
Modification de caractères à la volée a été créé par Meloo
Bonjour,
Je n'ai jamais fait de powershell, mais je dois m'y mettre pour faire un petit script.
Je cherche à modifier à la volée des valeurs d'un fichier.
En fait j'ai des caractères spéciaux (grecs, chinois, arabes...) dans un fichier en html :
Que j'aimerais traduire en :
Pour cela j'ai un fichier ini (j'ai rajouté un espace dans le code pour qu'il ne soit pas interprété) :
J'ai écrit le code suivant :
[code:1]$ini = @{}
switch -regex -file .\test.ini
{
\"(.+)=(.*)\"
{
$name, $value = $matches[1..2]
$ini[$section][$name] = $value
get-content -path .\in.txt | foreach {$_ -replace $name, $value} > out.txt
}
}[/code:1]
Bien sur cela ne fonctionne pas, voici une partie de l'erreur :
Pouvez-vous m'aider ?
Merci d'avance,
Meloo<br><br>Message édité par: Meloo, à: 27/03/12 18:37
Je n'ai jamais fait de powershell, mais je dois m'y mettre pour faire un petit script.
Je cherche à modifier à la volée des valeurs d'un fichier.
En fait j'ai des caractères spéciaux (grecs, chinois, arabes...) dans un fichier en html :
prenom;nom
pr&# 1075&# 1044n&# 1044om&# 1078 ;&# 1080&# 1080
Michel;Dupond
Que j'aimerais traduire en :
prenom;nom
pr&#1075;&#1044;n&#1044;om&#1078; ;&#1080;&#1080;
Michel;Dupond
Pour cela j'ai un fichier ini (j'ai rajouté un espace dans le code pour qu'il ne soit pas interprété) :
&# 1075=&#1075;
&# 1044=&#1044;
&# 1076=&#1076;
&# 1045=&#1045;
&# 1077=&#1077;
&# 1046=&#1046;
&# 1078=&#1078;
&# 1080=&#1080;
&# 1049=&#1049;
&# 1081=&#1081;
&# 1050=&#1050;
J'ai écrit le code suivant :
[code:1]$ini = @{}
switch -regex -file .\test.ini
{
\"(.+)=(.*)\"
{
$name, $value = $matches[1..2]
$ini[$section][$name] = $value
get-content -path .\in.txt | foreach {$_ -replace $name, $value} > out.txt
}
}[/code:1]
Bien sur cela ne fonctionne pas, voici une partie de l'erreur :
Ce qui ne me choque pas vraiment car pour moi je ne récupère tout le tableau... Mais je ne sais plus quoi modifier...Échec de l'opération d'index ; l'index de tableau a été évalué à Null.
Pouvez-vous m'aider ?
Merci d'avance,
Meloo<br><br>Message édité par: Meloo, à: 27/03/12 18:37
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
Réduire
Plus d'informations
- Messages : 6311
- Remerciements reçus 68
il y a 13 ans 11 mois #11384
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Modification de caractères à la volée
Salut,
je ne comprends pas ton intention avec cette ligne :
[code:1]
$ini[$section][$name] = $value
[/code:1]
L'erreur provient de $section qui n'est pas précisé.
Quant au fichier résultat(out.txt) il ne contiendra que le résultat de la dernière itération.
Le traitement ne devrait-il pas être inversé ?
[edit]
Une ébauche de solution :
[code:1]
#Hastable caractères cyrillique
$global:Ini = @{
\"&# 1075\"='&#1075;';
\"&# 1044\"='&#1044;';
\"&# 1076\"='&#1076;';
\"&# 1045\"='&#1045;';
\"&# 1077\"='&#1077;';
\"&# 1046\"='&#1046;';
\"&# 1078\"='&#1078;';
\"&# 1080\"='&#1080;';
\"&# 1049\"='&#1049;';
\"&# 1081\"='&#1081;';
\"&# 1050\"='&#1050;';
}
#Hastable de test de visu
$global:Ini = @{
\"&# 1075\"='1';
\"&# 1044\"='2';
\"&# 1076\"='3';
\"&# 1045\"='4';
\"&# 1077\"='5';
\"&# 1046\"='6';
\"&# 1078\"='7';
\"&# 1080\"='8';
\"&# 1049\"='9';
\"&# 1081\"='0';
\"&# 1050\"='*';
}
$s=$global:Ini.GetEnumerator()|% {$_.Key}
$ofs='|'
$regex=\"$s\"
#chaine de test
$Str='pr&# 1075&# 1044n&# 1044om&# 1078 ;&# 1080&# 1080'
#crée un délégué
$delegate= [System.Text.RegularExpressions.MatchEvaluator] {
param($value)
iex \"`$global:ini.'$Value'\"
}
#construit une regex
$re = [regex] $regex
#Appel le délégué pour chaque occurence trouvée
$Str |
ForEach-object { $re.Replace($_, $delegate) }
#renvoi :
#pr12n2om7 ;88
[/code:1]
Le pb restant étant la gestion du cyrillique
Une piste ...<br><br>Message édité par: Laurent Dardenne, à: 28/03/12 09:21
je ne comprends pas ton intention avec cette ligne :
[code:1]
$ini[$section][$name] = $value
[/code:1]
L'erreur provient de $section qui n'est pas précisé.
Quant au fichier résultat(out.txt) il ne contiendra que le résultat de la dernière itération.
Le traitement ne devrait-il pas être inversé ?
[edit]
Une ébauche de solution :
[code:1]
#Hastable caractères cyrillique
$global:Ini = @{
\"&# 1075\"='&#1075;';
\"&# 1044\"='&#1044;';
\"&# 1076\"='&#1076;';
\"&# 1045\"='&#1045;';
\"&# 1077\"='&#1077;';
\"&# 1046\"='&#1046;';
\"&# 1078\"='&#1078;';
\"&# 1080\"='&#1080;';
\"&# 1049\"='&#1049;';
\"&# 1081\"='&#1081;';
\"&# 1050\"='&#1050;';
}
#Hastable de test de visu
$global:Ini = @{
\"&# 1075\"='1';
\"&# 1044\"='2';
\"&# 1076\"='3';
\"&# 1045\"='4';
\"&# 1077\"='5';
\"&# 1046\"='6';
\"&# 1078\"='7';
\"&# 1080\"='8';
\"&# 1049\"='9';
\"&# 1081\"='0';
\"&# 1050\"='*';
}
$s=$global:Ini.GetEnumerator()|% {$_.Key}
$ofs='|'
$regex=\"$s\"
#chaine de test
$Str='pr&# 1075&# 1044n&# 1044om&# 1078 ;&# 1080&# 1080'
#crée un délégué
$delegate= [System.Text.RegularExpressions.MatchEvaluator] {
param($value)
iex \"`$global:ini.'$Value'\"
}
#construit une regex
$re = [regex] $regex
#Appel le délégué pour chaque occurence trouvée
$Str |
ForEach-object { $re.Replace($_, $delegate) }
#renvoi :
#pr12n2om7 ;88
[/code:1]
Le pb restant étant la gestion du cyrillique
Une piste ...<br><br>Message édité par: Laurent Dardenne, à: 28/03/12 09:21
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.038 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Modification de caractères à la volée