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

Langage Delphi Discussion :

[D7] Trouver et remplacer une chaine de car. dans un fichier


Sujet :

Langage Delphi

  1. #1
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut [D7] Trouver et remplacer une chaine de car. dans un fichier
    Bonjour,

    Au sein de l'un de mes projets actuels, je suis amené à copier des fichiers de type texte, et à modifier certaines valeurs (fixes) en leur sein.

    En fait mes fichiers ressemble à cela :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    xxxxxxxx xxxxx xxxx xxxxx Ma_Valeur xxxx xxxxxx xxxx xxxxx
    xxxxxxxx xxxxx xxxx xxxxx  xxxx xxxxxx xxxx xxxxx
    xxxxxxxx xxxxx xxxx xxxxx Ma_Valeur xxxx xxxxxx Ma_Valeur xxxxx
    xxxxxxxx xxxx xxxxxx xxxx xxxxx
    xxxxxxxx xxxxx xxxx xxxxxx Ma_Valeur xxxxx
    Je cherche donc à remplacer les occurences Ma_Valeur par une chaîne de carractère définie au moment de l'execution.
    En fait il s'agis de l'équivalent d'un simple 'remplacer par' de n'importe quel éditeur de texte.


    Mon code actuel consiste a charger le fichier dans une TStringlist et d'y appliquer la fonction StringReplace. Toutefois, cette méthode est assez longue et je souhaite savoir s'il n'existe pas une fonction prédéfinie qui permet de traiter directement le fichier sans avoir à le charger en mémoire. (TFile ?)

    Bien entendu j'ai parcouru la FAQ, mais je n'ai pas trouver d'équivalence à ce problème.

  2. #2
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Je diffuse mon code pour peu que ça intérresse

    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
     
    var
      Mon_Fichier : TStringList;
    begin
      Mon_Fichier := TStringList.Create;
     
      try
     
        if FileExists('C:\..\Sources\Le_Fichier_A_Traiter.txt') then
        begin
          Mon_Fichier.LoadFromFile('C:\..\Sources\Le_Fichier_A_Traiter.txt');
          StringReplace(Mon_Fichier.Text,'La_Valeur_Recherchée','La_Nouvelle_Valeur',[rfReplaceAll]);
          Mon_Fichier.SaveToFile('C:\..\Sources\Le_Nouveau_Fichier.txt');
        end;
     
      finally
        Mon_Fichier.Free;
      end;
     
    end;

  3. #3
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Quand j'ai a faire ce genre de manipulation, je boucle sur le fichier, j'écris un fichier temporaire et à la fin je remplace le fichier par mon temporaire

    avec

    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
    var
      f,Tmp : textfile;
      S : String;
    begin
    (...)
      Assign(f,'C:\texte.txt');
      Assign(tmp,'C:\texte.tmp');
      Rewrite(tmp);
      Reset(f);
      While not Eof(f) do
      begin
        Readln(f,s);
        ReplaceStr(s,Ma_valeur,ManouvelleValeur,[rfReplaceAll]);
        Writeln(Tmp,s);
      end;
      Closefile(f);
      Flush(Tmp);
      Closefile(tmp);
      //Suppression du fichier txt
      //Rennomage du .tmp en .txt
    Code écrit de mémoire sans Delphi, il y a peut être des erreurs
    Il faut aussi dire que je n'ai jamais eu à traiter des fichiers de plus de 10.000 lignes donc j'ai toujours trouvé ça rapide à tester !

  4. #4
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Merci pour ta réponse, mais en traitant le fichier ligne par ligne, le traitement est aussi long qu'avec la méthode utilisant une TStringList.

    En fait au vu de la taille de mes fichiers, le chargement en TStringList n'est qu'un problème mineur. Le véritable but de ce post étant de déterminer s'il existe déjà une fonction pré-programmé

  5. #5
    Membre confirmé
    Avatar de Manopower
    Inscrit en
    Décembre 2003
    Messages
    516
    Détails du profil
    Informations forums :
    Inscription : Décembre 2003
    Messages : 516
    Points : 453
    Points
    453
    Par défaut
    Pour répondre à ta question alors je ne penses pas, en tout cas pas dans la VCL et si il en existait une, elle ferait quand même une boucle en interne, y'a pas de solution magique, il faut bien un moment ou un autre vérifier sur chaque ligne l'occurence de Ma_valeur.

  6. #6
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Je ne pense pas non plus que le gain de performance soit probant, mais si une telle fonction existe, je préfère la connaitre et l'utiliser

    Cela dit, merci encore.


    Au fait, pourquoi n'y a t'il aucune réponse de ce genre dans la FAQ ?

  7. #7
    Membre régulier Avatar de Escandil
    Profil pro
    Inscrit en
    Mai 2003
    Messages
    84
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2003
    Messages : 84
    Points : 70
    Points
    70
    Par défaut
    Apres tests (désolé ça m'a pris un peu de temps) ta méthode me permet surtout de ne pas surcharger ma mémoire vive (déjà très demandée par le reste du programme) et me permet effectivement un léger gain de temps.

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 561
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 561
    Points : 3 951
    Points
    3 951
    Par défaut
    Salut

    Il n'existe rien de standard à ma connaissance dans Delphi sur ce sujet.
    La solution consiste à mon avis à trouver des algorithmes de recherche, sur le Net ou dans des livres, répondant à ton besoin et les coder en Delphi.

    Emploie de préférence les objet TFileStream pour l'accès au fichier, cela t'évitera le chargement en mémoire qui n'apporte rien et peut consommer beaucoup de mémoire. Problème à résoudre : La modification efficace des données du fichier si le texte de remplacement est de taille différente de celle du texte à remplacer.

    cdlt

    e-ric

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

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

Discussions similaires

  1. Rechercher/remplacer une chaine de caractères dans plusieurs fichiers
    Par _shuriken_ dans le forum Shell et commandes GNU
    Réponses: 5
    Dernier message: 31/07/2011, 20h06
  2. Remplacer une chaine de caractère dans un fichier texte.
    Par Empty_body dans le forum VBA Access
    Réponses: 1
    Dernier message: 19/01/2008, 11h16
  3. Remplacer une chaîne de caractères dans un fichier .hex
    Par subsix dans le forum Assembleur
    Réponses: 8
    Dernier message: 23/11/2006, 21h06
  4. Réponses: 4
    Dernier message: 18/07/2006, 16h31
  5. Réponses: 10
    Dernier message: 16/06/2006, 13h53

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