Question [Resolu] Traitement de caractères

Plus d'informations
il y a 15 ans 10 mois #6602 par Seals
Bonjour,

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.

Plus d'informations
il y a 15 ans 10 mois #6604 par Laurent Dardenne
Seals écrit:

Vous utiliseriez quelle commande/méthodes pour faire cette action ?

Cela dépend de ta recherche initiale que tu ne communiques pas.
Regarde les propriétés d'un objet renvoyé par Select-String, Line je crois.
Seals écrit:

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

Il me semble en avoir trouvé sur le net, avec google essaie :

Select-String +\&quot;-Context\&quot;

Qq exemples :
[code:1]
$result=@\&quot;
un
deux1
trois1
quatre
cinq1
\&quot;@ &gt; \&quot;c:\temp\t.txt\&quot;
Select-string \&quot;c:\temp\t.txt\&quot; -pattern \&quot;deux.*\&quot; -context 1,2
# C:\temp\t.txt:1:un
# &gt; C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1
# C:\temp\t.txt:4:quatre
Select-string \&quot;c:\temp\t.txt\&quot; -pattern \&quot;deux*\&quot; -context 0,2
# &gt; C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1
# C:\temp\t.txt:4:quatre
Select-string \&quot;c:\temp\t.txt\&quot; -pattern \&quot;deux.*\&quot; -context 1,1
# C:\temp\t.txt:1:un
# &gt; C:\temp\t.txt:2:deux1
# C:\temp\t.txt:3:trois1

Select-string \&quot;c:\temp\t.txt\&quot; -pattern \&quot;1$\&quot; -context 1,2
# C:\temp\t.txt:1:un
# &gt; C:\temp\t.txt:2:deux1
# &gt; 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.

Plus d'informations
il y a 15 ans 10 mois #6609 par Seals
Réponse de Seals sur le sujet Re:Traitement de caractères
J'ai un fichier .txt qui contient un bon millier de lignes.
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 \&quot;c:\Scripts\temp\liste.txt\&quot;
$liste2 = $liste3 = \&quot;\&quot;

ForEach ( $R_Liste in $Liste ) {
#supprime les 16 premiers caracteres
$R_Liste.remove( 0,16 )
$liste2 += $R_Liste +\&quot;`n\&quot;
} [/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 \&quot;.\&quot; et \&quot;=\&quot;
$indexdebut = Select-String $R_Liste2 -pattern \&quot;.\&quot;
$indexfin = Select-String $R_Liste2 -pattern \&quot;=\&quot;
$longeur = $indexfin - $indexdebut
$R_Liste2.remove( $indexdebut,$longeur)
$liste3 += $R_Liste2 +\&quot;`n\&quot;
} [/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.

Plus d'informations
il y a 15 ans 10 mois #6610 par Laurent Dardenne
Seals écrit:

Et j'aimerai que pour chaque ligne je supprime le .ini:2:1= en sachant que cette chaine peut varier.

Peux-tu nous communiquer qq exemples de lignes avant et après le traitement actuel.
J'ai un peu de mal à visualiser le pb :pinch:

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.

Plus d'informations
il y a 15 ans 10 mois #6611 par Seals
Réponse de Seals sur le sujet Re:Traitement de caractères
Dans mon fichier brut .txt j'ai ce type de ligne :
[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.

Plus d'informations
il y a 15 ans 10 mois #6612 par Laurent Dardenne
Ainsi je comprends mieux ton problème, bien que tu l'aies correctement énoncé dans ton premier post, fallait juste préciser certains points.

Alors, 2 approches possible, basées sur le fichier de test suivant :
[code:1]@\&quot;
\\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
\&quot;@ &gt; \&quot;c:\temp\test.txt\&quot;[/code:1]
La première à l'aide de l'opérateur -Replace :
[code:1]Get-Content \&quot;c:\temp\test.txt\&quot;|
Foreach-Object { $_ -replace \&quot;(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\&quot;,'$2 $3'}[/code:1]
La seconde à l'aide de Select-String :
[code:1]Select-string \&quot;c:\temp\test.txt\&quot; -pattern \&quot;(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\&quot;|
Foreach-Object {$_.Matches|% {\&quot;$($_.groups[2]) $($_.groups[3])\&quot;}}[/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]\&quot;(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)\&quot;[/code:1]
(.*)\$\\(fichier\d{1,}) : tous les caractères jusqu'au premier chiffre.
(fichier\d{1,}) : la suite de caractères \&quot;fichier\&quot; suivi d'au moins un chiffre ou plusieurs.
.txt:\d{1,} : la suite de caractères \&quot;.txt:\&quot; suivi d'au moins un chiffre ou plusieurs.
\d{1,} : au moins un chiffre ou plusieurs.
=(.*) : le caractère \&quot;=\&quot; suivi du reste des caractéres ( on peut ajouter ^ et $ pour préciser l'intention), \&quot;^(.*)\$\\(fichier\d{1,}).txt:\d{1,}:\d{1,}=(.*)$\&quot;.

Groupes, pour la ligne [code:1]\&quot;\\hp6000\temp$\fichier42.txt:5:8=Mini\&quot;[/code:1]
1=(.*) -&gt; \\\\\\\\hp6000\\\\temp
$2=(fichier\d{1,}) -&gt; fichier42
3=(.*) -&gt; 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.

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