Page 1 sur 2

[R] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 17:54
par Wardow
Bonjour à tous, je souhaiterais supprimer un mot qui se trouve dans un fichier texte , tout les mots sont à la ligne.

Par exemple :

Code : Tout sélectionner

William
Thomas
Ludovic
Thierry
Le mot à supprimer est stocké dans la variable $selection = Ludovic

Donc après suppression le fichier devrait ressembler à :

Code : Tout sélectionner

William
Thomas
Thierry

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 18:14
par Tlem
Avec StringReplace ou StringRegExpReplace (ca c'est pour mikell)

Lisez votre texte dans une variable, puis faite le remplacement éléments par éléments (n'oubliez pas le retour à la ligne) puis sauvegardez votre résultat. ;)

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 18:42
par PandiPanda
Ou _ReplaceStringInFile()

*qui en lui même fait ce qui est proposé plus haut ^^*

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 19:25
par mikell
L'obsédé du regex :mrgreen:
Bah ici apparemment un StringReplace est largement suffisant

Code : Tout sélectionner

$newtext = StringReplace(FileRead("fichier.txt"), "Ludovic" & @crlf, "")
$file = FileOpen("fichier.txt", 2)
FileWrite($file, $newtext)
FileClose($file)
Mais si on veut prendre en compte le fait qu'il peut y avoir des blancs invisibles sur la ligne après le nom à virer, alors c'est vrai vaut mieux

Code : Tout sélectionner

$newtext = StringRegExpReplace(FileRead("fichier.txt"), 'Ludovic\s*', "")
ou avec variable

Code : Tout sélectionner

$kasstoy = "Ludovic"
$newtext = StringRegExpReplace(FileRead("fichier.txt"), $kasstoy & '\s*', "")

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 20:03
par jguinch
Bonsoir.
Je veux pas faire mon chiant mais si on veut être juste, pas sûr que le StringReplace soit suffisant... :shock:
Si on imagine la liste suivante :

Code : Tout sélectionner

William
Thomas
Jean-Claude
Ludovic
Thierry
Jean
et on veut supprimer Jean...

Avec stringReplace, on aura le résultat suivant :

Code : Tout sélectionner

William
Thomas
-Claude
Ludovic
Thierry
:P


Je propose le code suivant pour ne pas supprimer la moitié de Jean-Claude :

Code : Tout sélectionner

#include <File.au3>

$str2Delete = "Jean"

Local $content
If NOT _FileReadToArray("fichier.txt", $content) Then Exit

$f = FileOpen("fichier.txt", 2)

For $i = 1 To $content[0]
    If NOT StringRegExp($content[$i], "\A(?i)" & $str2Delete & "\Z") Then FileWriteLine($f, $content[$i])
Next
FileClose($f)

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 20:08
par TommyDDR

Code : Tout sélectionner

SringReplace(@CRLF & $Selection & @CRLF, @CRLF)
Mais pas de chance pour le 1er et dernier élément (quoi que le dernier peut être bon si vous laissez une ligne vide à la fin)

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 20:45
par Wardow
Merci à vous tous, par contre comme la variable contenant le prénom est selectionée avec une liste donc le jean ne sera pas supprimé , sauf si il y à plusieurs noms avec jean dedans je ne sais pas si votre dernière proposition fonctionnera dans ce cas ...

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 20:59
par Tlem
@PandiPanda
Dans l'absolu, _ReplaceStringInFile() fonctionne, mais il obligera l'ouverture puis la fermeture du fichier pour chaque recherche ... :?

@mikell
Le fait de dire "Mais si on veut prendre en compte le fait qu'il peut y avoir des blancs invisibles sur la ligne après le nom à virer" implique que la demande ne serait pas complète. Tu rajoute un élément qui n'existe probablement pas et qui si il existe, impliquera bien plus de précaution sur les prénoms composés.

Si Wardow confirme une éventuelle possibilité d'erreur dans le fichier et donc que certaines entrées peuvent être composées d'espace avant ou après le prénom, alors il faudra étudier une solution bien plus évoluée.

En attendant, SringReplace($Selection & @CRLF, "") devrait suffire amplement.

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:26
par mikell
@Tlem
Le petit espace laissé et oublié à la fin d'une ligne de texte est qqe chose d'assez fréquent (alors qu'en début de ligne, on peut le voir)
Et StringReplace($Selection & @CRLF, "") ne marche pas si le prénom à virer est en fin de fichier sans @crlf

@jguinchard
OK alors pour le faire sérieux, avec un fichier type

Code : Tout sélectionner

William
Thomas
Jean-Claude
Jean Marc
Thierry
Jean
tu le fais avec ça

Code : Tout sélectionner

$kasstoy = "jean"
msgbox(0,"", StringRegExpReplace(FileRead("fichier.txt"), '(?i)' & $kasstoy & '\s*(?=\r\n|\z)\s*', "") )
:P

Re: [..]Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:31
par Tlem
Chaque solution pourra être pris à défaut selon les cas proposés.

Si on commence par imaginer des choses, alors pourquoi se limiter à de simples espaces avant, après, des fins de ligne manquantes, trait d'union etc ...
Pourquoi ne pas aller jusqu'au bout :

Code : Tout sélectionner

JeanMarc
Jean Marc
Jean-Marc 
 Jean -Marc
Jean- Marc
Jean_Marc
Bref, je m’arrête là pour cet exemple, mais il est possible de mixer les accents, les caractères accentués étranger etc ...

Soyons clair. Il n'existe pas de solution miracle. Ou alors il faudrait "développer une IA" capable d'interpréter les données et faire le rapprochement entre Bénédicte et Benedicte ... (1)

Bref, il est possible de ce prendre la tête des heures pour rien, mais si la donnée source ou les données de recherche ne sont pas justes, alors il n'est pas possible en l'état de faire une comparaison viable.

Pour répondre à mikell concernant le @CRLF de fin de fichier, certes celui-ci peut être manquant (bien que ce ne soit pas logique), mais dans ce cas il pourrait être judicieux de passer comme le suggère jguinchard et de faire un traitement dans les deux parties sur les espaces (ce qui limitera les risques d'erreurs, sans toutefois les supprimer totalement).

(1) Bien que je doute que Wardow ait besoin de passer par cet extrême, il pourrait être envisagé "une IA light" qui simplifierait les chaines de recherche/données en un modèle sans fioriture.
Genre :

Code : Tout sélectionner

Jean -Marc => jeanmarc
Jérémie => jeremie
Loïc => loic
Pour les espaces, c'est facile. Pour les caractères accentués, il faudra passer par une table de conversion.

En passant par ce type de traitement sur l'entrée et la donnée à comparer, on peut estimer un résultat sûr à 99% mais il existe encore et toujours des possibilités d'erreur. 8)

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:32
par Wardow
Waou, la ça commence à se compliquer, vous pouvez me faire un résumé svp ? :D

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:35
par Tlem
Ben ça dépend de la solution désirée ...

60-80% ou 99% ? :lol:

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:39
par Wardow
le 99% bien sur :lol:
Mais je ne sais pas ... faut quand même que j'y arrive, voila mon script entier :
► Afficher le texteScript

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:49
par mikell
Boss je suis d'accord avec ta démo mais en attendant mon dernier regex gère toutes (?) les exceptions que tu as citées
J'ai pas testé les caractères suédois mais en principe ça doit marcher aussi
Bien sûr, un "e" à la place d'un "é" , ça devient une faute d'orthographe et là ça devient ingérable sauf par une IA :roll:
Maintenant faut bien arrêter de déconner à un moment donné, "Matias" et "Mathias" sont 2 noms différents ou alors ya une faute de frappe ?

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:56
par Tlem
@mikell
Je l'ai testé et 'Jean Marc' ne passe pas le cap. :cry:

De plus, si 'Mathias' et 'Matias' sont deux deux écritures différentes ou une faute de frappe alors 'Marc' et ' Marc' et identique (une faute de frappe :P )
Wardow a écrit :le 99% bien sur
Ca ne m'aurait pas étonné !!!

Hé bien comme vous choisissez la solution hard, voici le squelette de ce qu'il vous faudra faire :
Prendre la donnée soumise et la mettre dans une variable (facile).
Prendre les données de votre fichier et les mettre dans un tableau (facile).
Dans une boucle, lire ligne après ligne les données du tableau en les comparant à la donnée source (là ça va encore) mais pour chaque donnée, vous devez appliquer un "filtre" qui transformera la donnée originale en une donnée simplifiée qui ne contiendrait pas de caractère autre que des lettres sans accent (là ça ce corse un peut ^^).

Si deux données sont identique (donnée source = donnée tableau) alors on supprime l'information du tableau. Une fois la boucle terminée, il faut encore transformer le tableau en fichier, mais il ne faudra pas oublier de supprimer les lignes vides ... (bon ça, c'est pas le plus compliqué).

Et voilà ... :mrgreen:

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 22:58
par mikell
Tlem a écrit :@mikell
Je l'ai testé et 'Jean Marc' ne passe pas le cap. :cry:
Ah, tu as dû prendre le regex ancienne version, avant que je l'édite :mrgreen:

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 23:01
par Tlem
Tricheur.

[Mode triche ON]
Marche pas si on teste "Jéremie" et "Jérémie". :P
[Mode triche OFF]

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 23:03
par mikell
Rien du tout ! c'est pas tricher que de présenter un regex qui marche Image

Et pour le "é" , voir mon post précédent Image

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 23:04
par Tlem
Ouais, ben je ferais quand même pas l'IA light pour Wardow ce soir car je suis trop crevé. :D

Rohh, t’arrête pas de ré-éditer tes messages ...
Concernant l'accent comme tout autre caractère, cela devrait être considéré comme une faute. Donc peut importe les espaces, les traits d'union et tout ce qui s'ensuit. Soit on choisit une solution partielle, soit on pousse le vice pour essayer d'atteindre les 100%. Même si ta solution est correcte, elle n'est pas parfaite non plus et entre la première solution et la tienne, le pourcentage d'erreur sera probablement minime. Donc le choix appartient à Wardow : 60-80% ou 99% ^^

Re: [..] Supprimer un mot déjà connu d'un fichier texte

Posté : mer. 10 oct. 2012 23:07
par mikell
Dans ce cas-là, on dit au client : Image
Et on va roupiller pendant qu'il se prend la tête

Edit
Mon regex marche pas non plus pour "Michel" et "Mikaïlovitch" :(