Question Suppression d'une ligne

Plus d'informations
il y a 16 ans 3 mois #1458 par didine
Suppression d'une ligne a été créé par didine
En premier lieu ...\"Bonne Année\"
Et longue vie à cet incontournable forum !

Pour mon retour et , bien qu'ayant appris beaucoup
je n'arrive pas à

supprimer la ligne exemple
13 ième ligne d'une série de 200 textes

ou encore la ligne comportant la chaîne \"toto\"

je sais , vous allez me dire newt progreese à pas de
fourmi ....;)

[code:1]foreach {get-content -totalcount 27 -nomatchline=13 }[/code:1]

Les messages d'erreurs font trembler mon ordi !!!

Merci à Tous

NEWTON_

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

Plus d'informations
il y a 16 ans 3 mois #1459 par Jacques Barathon
Réponse de Jacques Barathon sur le sujet Re:Suppression d'une ligne
On va commencer par le plus simple, à savoir supprimer les lignes qui contiennent un texte particulier (\"toto\" dans ton exemple):

[code:1]get-content fichier.txt | where {$_ -notmatch \"toto\"}[/code:1]
Pour sauvegarder le résultat dans le même fichier, il faut un peu ruser, car une redirection simple en fin de ligne va générer un conflit d'accès (le fichier ne peut pas être à la fois lu par \"get-content\" et écrit par \">\" ou \"out-file\"). Au passage, on perdrait même le contenu du fichier d'origine, donc attention à la manip!

Selon la taille du fichier et la place qu'il prendrait en mémoire, on pourra soit rediriger dans un fichier temporaire et ensuite renommer ce fichier temporaire, soit garder les résultats en mémoire et ensuite réécrire ces résultats dans le fichier de départ. Voyons cette dernière méthode:

[code:1]
$fichier = get-content fichier.txt | where {$_ -notmatch \"toto\"}
set-content fichier.txt $fichier[/code:1]
Petite précision sur -notmatch: cet opérateur attend une expression régulière. Pas de souci quand on n'utilise qu'un texte simple composé de lettres et de chiffres, mais attention si le texte à exclure contient des caractères spéciaux. Il y a fort à parier que le résultat ne correspondra pas à ce que vous attendiez, simplement parce que ces caractères auront un sens particulier dans le contexte d'une expression régulière.

Pour éviter toute ambiguité et si on ne maîtrise pas les expressions régulières, on peut donc utiliser -notlike à la place de -notmatch. -notlike marche avec les caractères génériques classiques * et ? :

[code:1]get-content fichier.txt | where {$_ -notlike \"*toto*\"}[/code:1]
Maintenant, comment exclure la ligne n°13 d'un fichier? Une méthode simple consiste à lire les 12 premières lignes puis les lignes restantes à partir de la 14e. La contrainte de cette méthode est qu'elle oblige à charger tout le fichier en mémoire pour pouvoir lire \"de la 14e à la dernière ligne\":

[code:1]
$fichier = get-content fichier.txt
$fichier[0..11] > fichier.txt
$fichier[13..($fichier.length-1)] >> fichier.txt[/code:1]
On pourrait aussi utiliser select-string. Cette commandelette retourne des objets de type MatchInfo qui contiennent une propriété LineNumber:

[code:1]
dir fichier.txt | select-string . | where {$_.linenumber -ne 13} | foreach {$_.line} | out-file fichier2.txt
move fichier2.txt fichier.txt -force[/code:1]
Dans cet exemple j'ai redirigé la sortie vers un fichier temporaire pour ensuite écraser le fichier de départ avec le contenu du fichier temporaire.

J'aurais pu tout aussi bien utiliser une variable temporaire comme dans l'exemple précédent, mais l'avantage de la solution avec select-string est qu'elle permet un filtrage ligne par ligne et donc une meilleure gestion de la mémoire si le fichier contient un très grand nombre de lignes. Charger l'ensemble des lignes du fichier (sauf la ligne n°13) avant de les réécrire dans le fichier aurait donc totalement annulé l'avantage de cette solution.

Voilà, très rapidement, quelques idées de solutions. C'est sans doute perfectible mais ça devrait te donner des pistes à creuser.

Note également que dans la v2 CTP de PowerShell, select-string inclut un paramètre -notmatch qui permettrait d'utiliser cette commandelette dans le premier exemple (exclure les lignes qui contiennent \"toto\").

Janel<br><br>Message édité par: janel, à: 13/01/08 19:33

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

Plus d'informations
il y a 16 ans 3 mois #1464 par didine
Réponse de didine sur le sujet Re:Suppression d'une ligne
Janel , Grand Janel !!!

Toujours aussi efficace ici ...
comme ailleurs ...

Donc voici pour quelle solution j'ai opté
Efficacité 10/10 nickel !!!

Cela va te rappeler des choses et aussi à Arnaud
Comme quoi il faut toujours conserver les expériences précédentes .

Ayant 2 scripts dont le premier est celui-ci
J'essaie de trouver comment
faire \&quot;enchaîner\&quot; les deux scripts sans intervention de ma part .

En tous cas Grand Merci pour Ta précieuse et radicale
solution;)
Le script suivant est opérationnel et testé sur 50 fichiers .
Je crois que pour les 2 scripts il faut construire un troisième
avec script1.ps1 | script2.ps2

à tous les coups je me plante

[code:1]dir c:\mhd\t*.txt |foreach {get-content $_ | where {$_ -notmatch \&quot;toto\&quot;} |
set-content (\&quot;$_\&quot; -replace \&quot;t(.+)\.txt\&quot;,'$+.txt')}[/code:1]

C'est bon

[code:1]powershell c:\script1 | powershell c:\sctipt2[/code:1]

Je deviens .....moins nul;)

I'll come back , be sure;)<br><br>Message édité par: newt, à: 14/01/08 01:47

NEWTON_

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

Plus d'informations
il y a 16 ans 3 mois #1483 par Arnaud Petitjean
Réponse de Arnaud Petitjean sur le sujet Re:Suppression d'une ligne
Hello Newton,

J'essaie de trouver comment faire \&quot;enchaîner\&quot; les deux scripts sans intervention de ma part.


Alors c'est très simple. Il a plusieurs façons de faire : soit tu crées un 3e script qui contient l'appel vers les 2 autres. Exemple :
[code:1]
# MonScript3.ps1
#
./MonScript1.ps1
./MonScript2.ps1[/code:1]

soit directement dans l'interpreteur de commandes tu écris:
[code:1]./MonScript1.ps1;./MonScript2.ps1[/code:1]

Il ne faut surtout pas utiliser le pipe car en faisant cela le résultat d'exécution du premier script est passé au second, ce qui peut avoir des résultats assez imprévisibles. C'est le \&quot;;\&quot; qu'il te faut pour séparer les commandes.

Arnaud

MVP PowerShell et créateur de ce magnifique forum :-)
Auteur de 6 livres PowerShell aux éditions ENI
Fondateur de la société Start-Scripting
Besoin d'une formation PowerShell ?

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

Plus d'informations
il y a 16 ans 3 mois #1485 par didine
Réponse de didine sur le sujet Re:Suppression d'une ligne
Et moi qui pensais être devenu moins nul ....
je ne désespère pas !!!

Merci Arnaud j'ai vécu le \&quot;imprévisible\&quot;
maintenant je comprends ;)

NEWTON_

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

Plus d'informations
il y a 16 ans 3 mois #1486 par didine
Réponse de didine sur le sujet Re:Suppression d'une ligne
Je suis quand même très déçu
le script est op
s'agissant de la suppression de la ligne contenant \&quot;toto\&quot; , la ligne 13 ...

Chaque fichier comporte environ 2000 à 100000 lignes
Mon script 1 met un temps fou pour supprimer
juste cette ligne ...

En terme de rendement mon script est nul !!!

Pour supprimer rien qu'une ligne ?
Y'a t il quelque chose que je ne parviens pas
à traduire ???

à tous les coups ! Je suis un peu ...dégoutté
bon allez ....dépité:(

à l'aide :silly:

NEWTON_

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

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