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

Aide et conseils concernant AutoIt et ses outils.
Règles du forum
.
Wardow
Niveau 4
Niveau 4
Messages : 81
Enregistré le : dim. 31 juil. 2011 10:14
Status : Hors ligne

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

#1

Message 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
Modifié en dernier par Wardow le sam. 13 oct. 2012 13:50, modifié 1 fois.
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#2

Message 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. ;)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
PandiPanda
Membre émérite
Membre émérite
Messages : 656
Enregistré le : mar. 19 juil. 2011 14:03
Localisation : Bruxelles
Status : Hors ligne

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

#3

Message par PandiPanda »

Ou _ReplaceStringInFile()

*qui en lui même fait ce qui est proposé plus haut ^^*
La seule moralité qui tienne dans un monde cruel est la chance. Impartiale. Équitable. Vraie
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#4

Message 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*', "")
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
jguinch
Modérateur
Modérateur
Messages : 2515
Enregistré le : lun. 14 févr. 2011 22:12
Status : Hors ligne

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

#5

Message 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)
Le script, ça fait gagner beaucoup de temps... à condition d'en avoir beaucoup devant soi !
Avatar du membre
TommyDDR
Modérateur
Modérateur
Messages : 2111
Enregistré le : mar. 22 juil. 2008 21:55
Localisation : Nantes
Status : Hors ligne

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

#6

Message 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)
3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679
Wardow
Niveau 4
Niveau 4
Messages : 81
Enregistré le : dim. 31 juil. 2011 10:14
Status : Hors ligne

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

#7

Message 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 ...
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#8

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

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#9

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#10

Message 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)
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Wardow
Niveau 4
Niveau 4
Messages : 81
Enregistré le : dim. 31 juil. 2011 10:14
Status : Hors ligne

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

#11

Message par Wardow »

Waou, la ça commence à se compliquer, vous pouvez me faire un résumé svp ? :D
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#12

Message par Tlem »

Ben ça dépend de la solution désirée ...

60-80% ou 99% ? :lol:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Wardow
Niveau 4
Niveau 4
Messages : 81
Enregistré le : dim. 31 juil. 2011 10:14
Status : Hors ligne

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

#13

Message 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
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#14

Message 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 ?
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#15

Message 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:
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#16

Message 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:
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#17

Message par Tlem »

Tricheur.

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

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#18

Message 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
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Avatar du membre
Tlem
Site Admin
Site Admin
Messages : 11798
Enregistré le : ven. 20 juil. 2007 21:00
Localisation : Bordeaux
Status : Hors ligne

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

#19

Message 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% ^^
Thierry

Rechercher sur le forum ----- Les règles du forum
Le "ça ne marche pas" est une conséquence commune découlant de beaucoup trop de raisons potentielles ...

Une idée ne peut pas appartenir à quelqu'un. (Albert Jacquard) tiré du documentaire "Copié n'est pas volé".
Avatar du membre
mikell
Spammer !
Spammer !
Messages : 6292
Enregistré le : dim. 29 mai 2011 17:32
Localisation : Deep Cévennes
Status : Hors ligne

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

#20

Message 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" :(
" L'échec est le fondement de la réussite. " (Lao-Tseu )
" Plus ça rate, plus on a de chances que ça marche " (les Shadoks )
Répondre