IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Recherche et suppression d'un texte dans un fichier texte


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut Recherche et suppression d'un texte dans un fichier texte
    Bonjour à tous,

    J'ai deux fichiers texte que l'on va nommer fichier A et fichier B.
    Je voudrais tester si le contenu du fichier B se trouve dans le fichier A. S'il s'y trouve, j'aimerais le supprimer du fichier A.
    J'ai déjà essayé beaucoup de techniques, notamment à base de replace(), de split() mais dans tous les cas j'arrive à supprimer dans le fichier A uniquement la première ligne du fichier B alors que je voudrais supprimer dans le fichier A tout ce qui est contenu dans le fichier B.
    Le fichier A a été crée sous UNIX, et le fichier B sous Windows.

    J'espère que vous m'avez compris et j'espère qu'il y a une solution à mon problème

    Bonne journée!

  2. #2
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    Je n'ai toujours pas trouvé de solution à mon souci! Apparemment ça a l'air plus complexe que prévu!

  3. #3
    Max
    Max est déconnecté
    Expert confirmé

    Avatar de Max
    Homme Profil pro
    Artisan développeur
    Inscrit en
    Mai 2007
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Artisan développeur
    Secteur : Industrie

    Informations forums :
    Inscription : Mai 2007
    Messages : 2 954
    Par défaut
    Citation Envoyé par willythe88 Voir le message
    Je n'ai toujours pas trouvé de solution à mon souci! Apparemment ça a l'air plus complexe que prévu!
    Salut.

    C'est surtout que sans des morceaux de ton code cela va être difficile de t'aider Poste en et tu verras ça va se bousculer

  4. #4
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Tu récupères dans 2 strings le contenu de tes fichiers.

    Tu fais un int index = fileA.IndexOf(fileB), qui va te retourner l'endroit où se trouve le contenu du fichier B.

    Puis un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    string newFileA = fileA.Substring(index, fileB.Length);
    Et tu finis par remplacer ton fichier A par un nouveau fichier contenant newFileA.

    Pour ce qui est de l'Unix, je pense qu'il y a moyen de spécifier de quel type est le fichier texte lorsque tu le lis (les seuls changements doivent être au niveau des retour de ligne je pense)

  5. #5
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    J'ai essayé la méthode de zoubidaman et il s'avère qu'une exception est levée.

    Voici un bout de mon code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
     
    //Fichier à traiter
    string fichierLog = @"\\serveurUnix\logDuJour.log";
     
    //bloc d'erreur à ignorer dans le fichier à traiter
    string blocAIgnorer = @"\\serveurUnix\blocAIgnorer.txt";
     
    StreamReader lectureFichierLog = new StreamReader(fichierLog);
    string contenuFichierLog = lectureFichierLog.ReadToEnd();
    lectureFichierLog.Close();
     
    StreamReader lectureBlocAIgnorer = new StreamReader(blocAIgnorer);
    string contenuBlocAIgnorer = lectureBlocAIgnorer.ReadToEnd();
    lectureBlocAIgnorer.Close();
     
    int index = contenuFichierLog.IndexOf(contenuBlocAIgnorer);
    string nouveauContenuFichierLog = contenuFichierLog.Substring(index, contenuBlocAIgnorer.Length);
     
    StreamWriter sr = new StreamWriter("resultat.txt");
    sr.Write(nouveauContenuFichierLog);
    Quand le contenu à ignorer est sur plusieurs lignes, index retourne -1; la chaîne n'est donc pas trouvée dans le fichierLog (alors que je suis sûr qu'elle est bien dedans).

    Quand le contenu à ignorer est sur une seule ligne, tout se passe bien mais "nouveauContenuFichierLog" contient uniquement la ligne trouvée, alors que j'aimerais réecrire dans le fichier final tout le fichierLog moins le bloc à ignorer.

    Je ne sais pas si vous avez compris mes explications qui ne sont pas forcément claires! Je ne suis pas un expert en C#, je suis donc un peu perdu Merci à tous

  6. #6
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    ben à mon avis t'as un blème du côté des fin de lignes.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    abcd\r\n != abcd\n
    Je ferais un replace de \n par \r\n dans l'une ou l'autre des string (suivant qu'elle soit unix ou dos)

  7. #7
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    Je viens d'essayer de remplacer \n par \r\n dans une des chaîne, ça ne marche pas. J'ai fait pareil avec l'autre chaîne, même résultat

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par willythe88 Voir le message
    Quand le contenu à ignorer est sur plusieurs lignes, index retourne -1; la chaîne n'est donc pas trouvée dans le fichierLog (alors que je suis sûr qu'elle est bien dedans).
    Comme dit précédemment, c'est sûrement un souci avec les fins de ligne.

    Citation Envoyé par willythe88 Voir le message
    Quand le contenu à ignorer est sur une seule ligne, tout se passe bien mais "nouveauContenuFichierLog" contient uniquement la ligne trouvée, alors que j'aimerais réecrire dans le fichier final tout le fichierLog moins le bloc à ignorer.
    Ca c'est normal, et c'est à cause du code que j'ai donné.

    Le substring va retourner ce qu'il a trouvé, donc ton bloc à ignorer.

    Il faut plutôt que tu fasses quelque chose comme:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    int index = contenuFichierLog.IndexOf(contenuBlocAIgnorer);
     
    int indexAfterBlock = index + contenuBlocAIgnorer.Length;
    int lastPartSize = lectureFichierLog.Length - indexAfterBlock;
     
    string nouveauContenuFichierLog = contenuFichierLog.Substring(0, index) + contenuFichierLog.SubString(indexAfterBlock, lastPartSize);
     
    StreamWriter sr = new StreamWriter("resultat.txt");
    sr.Write(nouveauContenuFichierLog);
    Tu vas donc découper ton string en deux parties: du début du fichier au premier caractère du bloc à éliminer, et du premier caractère après le block à éliminer jusqu'à la fin.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par willythe88 Voir le message
    Je viens d'essayer de remplacer \n par \r\n dans une des chaîne, ça ne marche pas. J'ai fait pareil avec l'autre chaîne, même résultat
    Si tu veux remplacer les fins de ligne dans le fichier Unix, c'est transformer les \n en \r\n.

    Inversement pour Windows.

  10. #10
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    Voici l'exception qui est levée, même en remplaçant les \n en \r\n dans le fichier UNIX, ça donne la même erreur en faisant l'inverse dans le fichier Windows.

    Exception non gérée*: System.ArgumentOutOfRangeException: La longueur ne peut pas être inférieure à zéro.
    Nom du paramètre*: length
    à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, Boolean fAlwaysCopy)
    à rechercheErreursDansLogJour.Program.Main(String[] args) dans D:\William\Projets_C#\rechercheErreursDansLogJour\rechercheErreursDansLogJour\Program.cs:ligne 54
    Appuyez sur une touche pour continuer...

    J'ai une petite question pour zoubidaman:

    Dans le cas ou mon fichier à traiter est comme ceci:

    Bonjour, je suis le fichier à traiter
    ligne1
    ligne2
    ligne3
    ligne4
    Fin du fichier à traiter
    et mon fichier à ignorer est comme ça:
    ligne2
    ligne3
    On est bien d'accord que ça supprime ligne 2 et 3.

    Par contre si le fichier à traiter est identique au précédent et que le fichier à ignorer est comme ceci:
    ligne2
    autrechose
    ligne4
    On est d'accord que ça ne supprimera pas ni la ligne 2 ni la ligne 4? Ça ne supprime rien? Il faut bien qu'on trouve le bloc à ignorer complet et dans le bon ordre?

  11. #11
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Citation Envoyé par willythe88 Voir le message
    Voici l'exception qui est levée, même en remplaçant les \n en \r\n dans le fichier UNIX, ça donne la même erreur en faisant l'inverse dans le fichier Windows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Exception non gérée*: System.ArgumentOutOfRangeException: La longueur ne peut pa
    s être inférieure à zéro.
    Nom du paramètre*: length
       à System.String.InternalSubStringWithChecks(Int32 startIndex, Int32 length, B
    oolean fAlwaysCopy)
       à rechercheErreursDansLogJour.Program.Main(String[] args) dans D:\William\Pro
    jets_C#\rechercheErreursDansLogJour\rechercheErreursDansLogJour\Program.cs:ligne
     54
    Appuyez sur une touche pour continuer...
    C'est parce que tu ne peux pas donner d'index ou de longueur négative à SubString. Or c'est ce que te retourne IndexOf s'il ne trouve pas la chaine.


    Citation Envoyé par willythe88 Voir le message
    J'ai une petite question pour zoubidaman:

    Dans le cas ou mon fichier à traiter est comme ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    Bonjour, je suis le fichier à traiter
    ligne1
    ligne2
    ligne3
    ligne4
    Fin du fichier à traiter
    et mon fichier à ignorer est comme ça:
    On est bien d'accord que ça supprime ligne 2 et 3.

    Par contre si le fichier à traiter est identique au précédent et que le fichier à ignorer est comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ligne2
    autrechose
    ligne4
    On est d'accord que ça ne supprimera pas ni la ligne 2 ni la ligne 4? Ça ne supprime rien? Il faut bien qu'on trouve le bloc à ignorer complet et dans le bon ordre?
    Tout à fait

  12. #12
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    C'est parce que tu ne peux pas donner d'index ou de longueur négative à SubString. Or c'est ce que te retourne IndexOf s'il ne trouve pas la chaine.
    J'ai bien compris pour la valeur négative retournée et pour l'index qui ne peux pas être négatif Mais je n'arrive pas à avoir autre chose comme valeur alors que je suis sûr que le fameux bloc est contenu dans le fichier de log (j'ai fait un copier/coller pour ne pas faire d'erreurs).

  13. #13
    Membre émérite Avatar de ppphil
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    617
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2007
    Messages : 617
    Par défaut
    Si jamais un autre exemple : (que je viens de tester et qui fonctionne très bien)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     string a; //unix
          string b; //dos
     
          a = File.ReadAllText("C:\\temp\\a.txt", Encoding.Default);
          b = File.ReadAllText("C:\\temp\\b.txt", Encoding.Default);
     
          b = b.Replace("\r\n","\n");
          a = a.Replace(b, "");
          File.WriteAllText("C:\\temp\\c.txt", a, Encoding.Default);
    Attention toutefois, File.ReadAllText (et le Write) sont bien efficaces mais uniquement avec des petits fichiers (500ko sans problèmes)

  14. #14
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    Pour éviter l'exception, ajoute une condition qui arrête le traitement si index = -1

    Ensuite pour le multilignes, je ne sais pas, je n'ai jamais eu à ouvrir de fichier *nix sous Windows

  15. #15
    Membre chevronné
    Profil pro
    Inscrit en
    Février 2003
    Messages
    311
    Détails du profil
    Informations personnelles :
    Âge : 44
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2003
    Messages : 311
    Par défaut
    le message de ppphil me fait penser qu'effectivement c'est peut-être un encodage différent qui fait que ça déconne?

    Si tu veux détecter quel encodage a été utilisé pour le fichier afin de l'ouvrir proprement, tu peux jeter un oeil à ce lien http://devhood.com/tutorials/tutoria...utorial_id=469

  16. #16
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    Merci ppphil, je vais essayer votre astuce!
    Je viens de voir que si je copie le fichier de log vers le fichier bloc, puis qu'ensuite j'édite le fichier de bloc avec Notepad++ pour garder que les lignes à ignorer, ça fonctionne. Par contre ça ne fonctionne pas lorsque je copie le contenu du fichier au lieu du fichier intégralement. Je pense donc que ça vient bien des différences de retour à la ligne.

    Je vous tiens au courant! Merci à tous

  17. #17
    Membre averti
    Inscrit en
    Janvier 2010
    Messages
    26
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 26
    Par défaut
    Apparemment, l'édition avec Notepad++ du fichier bloc fonctionne plutôt bien (en copiant auparavant le fichier log vers le fichier bloc). Par contre avec Wordpad ça ne fonctionne pas!

    Edit: Je suis sur votre lien zoubidaman Et pour la condition d'arrêt si -1 merci du conseil!

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Suppression de lignes blanches dans un fichier texte
    Par supcomingenieur dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 15/05/2013, 23h42
  2. Une fonction recherchant l'occurrence d'une chaîne dans un fichier texte
    Par l_autodidacte dans le forum Vos Contributions VBScript
    Réponses: 5
    Dernier message: 11/05/2012, 15h30
  3. Réponses: 10
    Dernier message: 07/07/2011, 14h19
  4. Ouvrir plusieurs fichier textes dans un dossier : *texte.txt
    Par Jenn74 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 16/05/2007, 17h52
  5. Réponses: 3
    Dernier message: 25/07/2006, 09h40

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo