Question Modification de caractères à la volée

Plus d'informations
il y a 13 ans 11 mois #11383 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 :

prenom;nom
pr&# 1075&# 1044n&# 1044om&# 1078 ;&# 1080&# 1080
Michel;Dupond


Que j'aimerais traduire en :

prenom;nom
prгДnДomж ;ии
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=г 
&# 1044=Д 
&# 1076=д 
&# 1045=Е 
&# 1077=е 
&# 1046=Ж 
&# 1078=ж 
&# 1080=и 
&# 1049=Й 
&# 1081=й 
&# 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 :

Échec de l'opération d'index ; l'index de tableau a été évalué à Null.

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

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.

Plus d'informations
il y a 13 ans 11 mois #11384 par Laurent Dardenne
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 = @{
\&quot;&amp;# 1075\&quot;='&amp;#1075;';
\&quot;&amp;# 1044\&quot;='&amp;#1044;';
\&quot;&amp;# 1076\&quot;='&amp;#1076;';
\&quot;&amp;# 1045\&quot;='&amp;#1045;';
\&quot;&amp;# 1077\&quot;='&amp;#1077;';
\&quot;&amp;# 1046\&quot;='&amp;#1046;';
\&quot;&amp;# 1078\&quot;='&amp;#1078;';
\&quot;&amp;# 1080\&quot;='&amp;#1080;';
\&quot;&amp;# 1049\&quot;='&amp;#1049;';
\&quot;&amp;# 1081\&quot;='&amp;#1081;';
\&quot;&amp;# 1050\&quot;='&amp;#1050;';
}

#Hastable de test de visu
$global:Ini = @{
\&quot;&amp;# 1075\&quot;='1';
\&quot;&amp;# 1044\&quot;='2';
\&quot;&amp;# 1076\&quot;='3';
\&quot;&amp;# 1045\&quot;='4';
\&quot;&amp;# 1077\&quot;='5';
\&quot;&amp;# 1046\&quot;='6';
\&quot;&amp;# 1078\&quot;='7';
\&quot;&amp;# 1080\&quot;='8';
\&quot;&amp;# 1049\&quot;='9';
\&quot;&amp;# 1081\&quot;='0';
\&quot;&amp;# 1050\&quot;='*';
}

$s=$global:Ini.GetEnumerator()|% {$_.Key}
$ofs='|'
$regex=\&quot;$s\&quot;

#chaine de test
$Str='pr&amp;# 1075&amp;# 1044n&amp;# 1044om&amp;# 1078 ;&amp;# 1080&amp;# 1080'

#crée un délégué
$delegate= [System.Text.RegularExpressions.MatchEvaluator] {
param($value)
iex \&quot;`$global:ini.'$Value'\&quot;
}
#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 :silly:
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.039 secondes
Propulsé par Kunena