Question
[Resolu] Traitement de caractères
- Seals
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 39
- Remerciements reçus 0
Je suis à la recherche d'une commande qui me permet de supprimer un bout d'une chaine de caractère (de taille variable) qui est délimitée par \".\" et \"=\"
En DOS il y a bien la commande \"for /f token\". Mais en PS ??
Avec Select-String j'arrive à trouver mes délimiteurs
Mais il me renvoie la ligne et la position correspondante. Du coup j'arrive pas a y faire un $_.remove(x,y).
Dans l'aide ils disent également que l'on peut extraire la chaines avant ou après le délimiteur. Mais il n'y a pas d'exemple
J'ai pensé à spliter les lignes mais après j'arrive pas à récupérer mes valeurs (nom du fichier) et (toto)
exp de chaine ou je voudrais suprimer le :2:1 :
\\hp6000\temp$\fichier1.txt:2:1=toto
\\hp6000\temp$\fichier22.txt:3:2=tintin
Vous utiliseriez quelle commande/méthodes pour faire cette action ?
Merci.<br><br>Message édité par: Seals, à: 28/04/10 14:35
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Cela dépend de ta recherche initiale que tu ne communiques pas.Vous utiliseriez quelle commande/méthodes pour faire cette action ?
Regarde les propriétés d'un objet renvoyé par Select-String, Line je crois.
Seals écrit:
Il me semble en avoir trouvé sur le net, avec google essaie :Dans l'aide ils disent également que l'on peut extraire la chaines avant ou après le délimiteur. Mais il n'y a pas d'exemple
Qq exemples :Select-String +\"-Context\"
[code:1]
$result=@\"
un
deux1
trois1
quatre
cinq1
\"@ > \"c:\temp\t.txt\"
Select-string \"c:\temp\t.txt\" -pattern \"deux.*\" -context 1,2
# C:\temp\t.txt:1:un
# > C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1
# C:\temp\t.txt:4:quatre
Select-string \"c:\temp\t.txt\" -pattern \"deux*\" -context 0,2
# > C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1
# C:\temp\t.txt:4:quatre
Select-string \"c:\temp\t.txt\" -pattern \"deux.*\" -context 1,1
# C:\temp\t.txt:1:un
# > C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1
Select-string \"c:\temp\t.txt\" -pattern \"1$\" -context 1,2
# C:\temp\t.txt:1:un
# > C:\temp\t.txt:2:deux1
# > C:\temp\t.txt:3:trois1
# C:\temp\t.txt:4:quatre
# C:\temp\t.txt:5:cinq
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Seals
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 39
- Remerciements reçus 0
Contenant :
\\hp6000\temp$\fichier1.txt:2:1=toto
\\hp6000\temp$\fichier22.txt:3:2=tintin
j'importe le fichier par :
[code:1]$Liste = Get-Content -path \"c:\Scripts\temp\liste.txt\"
$liste2 = $liste3 = \"\"
ForEach ( $R_Liste in $Liste ) {
#supprime les 16 premiers caracteres
$R_Liste.remove( 0,16 )
$liste2 += $R_Liste +\"`n\"
} [/code:1]
Et j'aimerai que pour chaque ligne je supprime le .ini:2:1= en sachant que cette chaine peut varier.
Du coup je n'aurais que le nom du fichier et la valeur après le =.
Concernant le -context avec la commande Select-Sting, il renvoie les lignes suivantes et pas juste les caractères avant ou après le -pattern trouvé.
Après je me suis dit que je pourrais prendre la methode remove en mettant l'index retourner par le -pattern. Mais ca ne fonctionne pas non plus.
Inclus ds ma boucle for
[code:1] ForEach ( $R_Liste2 in $Liste2 ) {
#cherche la position du \".\" et \"=\"
$indexdebut = Select-String $R_Liste2 -pattern \".\"
$indexfin = Select-String $R_Liste2 -pattern \"=\"
$longeur = $indexfin - $indexdebut
$R_Liste2.remove( $indexdebut,$longeur)
$liste3 += $R_Liste2 +\"`n\"
} [/code:1]
Du coup, je ne sais pas trop comment faire d'ou ma question du comment vous procéderiez ?
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Peux-tu nous communiquer qq exemples de lignes avant et après le traitement actuel.Et j'aimerai que pour chaque ligne je supprime le .ini:2:1= en sachant que cette chaine peut varier.
J'ai un peu de mal à visualiser le pb
A priori l'usage d'une expression régulière me semble approprié, mais il faut connaître les différents cas qui peuvent se présenter.
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Seals
- Auteur du sujet
- Hors Ligne
- Membre junior
-
- Messages : 39
- Remerciements reçus 0
[code:1]
\\hp6000\temp$\fichier1.txt:2:1=toto
\\hp6000\temp$\fichier10.txt:13:2=tintin
\\hp6000\temp$\fichier22.txt:5:12=Mickey
\\hp6000\temp$\fichier42.txt:5:8=Mini
[/code:1]
Après ma boucle for et mon .remove, j'obtiens dans ma $Liste2
[code:1]
fichier1.txt:2:1=toto
fichier10.txt:13:2=tintin
fichier22.txt:5:12=Mickey
fichier42.txt:5:8=Mini
[/code:1]
Et au final j'aimerai obtenir ds ma $Liste3
(entre le . et le = c'est une chaine variable mais seul ces deux caractères sont commun à l'ensemble)
[code:1]
fichier1 toto
fichier10 tintin
fichier22 Mickey
fichier42 Mini
[/code:1]
Merci
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Alors, 2 approches possible, basées sur le fichier de test suivant :
[code:1]@\"
\\hp6000\temp$\fichier1.txt:2:1=toto
\\hp6000\temp$\fichier10.txt:13:2=tintin
\\hp6000\temp$\fichier22.txt:5:12=Mickey
\\hp6000\temp$\fichier42.txt:5:8=Mini
\\hp6000\temp$\fichier425.txt:1:2=Riri
\\hp6000\temp$\fichier42.txt:15:20=Fifi
\\hp6000\temp$\fichier4.txt:150:200=Loulou
\"@ > \"c:\temp\test.txt\"[/code:1]
La première à l'aide de l'opérateur -Replace :
[code:1]Get-Content \"c:\temp\test.txt\"|
Foreach-Object { $_ -replace \"(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\",'$2 $3'}[/code:1]
La seconde à l'aide de Select-String :
[code:1]Select-string \"c:\temp\test.txt\" -pattern \"(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\"|
Foreach-Object {$_.Matches|% {\"$($_.groups[2]) $($_.groups[3])\"}}[/code:1]
L'expression régulière est identique et je pense que la première approche est plus rapide, mais je n'ai pas mesurer les perfs...
Un peu de doc :
Pour [code:1]\"(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\"[/code:1]
(.*)\$\\(fichier\d{1,}) : tous les caractères jusqu'au premier chiffre.
(fichier\d{1,}) : la suite de caractères \"fichier\" suivi d'au moins un chiffre ou plusieurs.
.txt:\d{1,} : la suite de caractères \".txt:\" suivi d'au moins un chiffre ou plusieurs.
\d{1,} : au moins un chiffre ou plusieurs.
=(.*) : le caractère \"=\" suivi du reste des caractéres ( on peut ajouter ^ et $ pour préciser l'intention), \"^(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)$\".
Groupes, pour la ligne [code:1]\"\\hp6000\temp$\fichier42.txt:5:8=Mini\"[/code:1]
1=(.*) -> \\\\\\\\hp6000\\\\temp
$2=(fichier\d{1,}) -> fichier42
3=(.*) -> Mini<br><br>Message édité par: Laurent Dardenne, à: 27/04/10 15:00
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- [Resolu] Traitement de caractères