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

API, COM et SDKs Delphi Discussion :

Remplacer Ligne dans Fichier


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut Remplacer Ligne dans Fichier
    Salut

    J'ai un fichier de la sorte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    BEGIN OF FILE ...
    .....
    .....
    42. line text string datas blal blalblal
    43. line text string datas blal blalblal
    44. line text string datas blal blalblal
    45. line text string datas blal blalblal
    46. line text string datas blal blalblal
    ...
    ...
    END OF FILE LINE ...
    Je voudrais remplacer par exemple la ligne N°44 par une autre STRING

    Une alternative consiste a charger le fichier dans un TStrings et de le modifier, mais ceci reste non pratique dans mon cas, car des fichiers peuvent dépasser les 200 mo, et le chargement dans ces cas, bloque le PC en sachant que dans mon application il est y'a remplacement de ligne ou insertion fréquentes,

    Ma Question est :
    1. est il possible de le faire en écrivant directement a l'endroit spécifié dans le fichier sur disque, si oui comment ?
    2. cette méthode est elle aussi valable pour les fichiers non texte (binaires ...)

    MErci !

    PS : En fait c la méme chose que les fichiers de base de donnés, lorsque on insere un enregistrement dans la base de données , dans certains cas le fichiers dépassent le GO, je ne pense pas que le fichier en totalité soit chargé en mémoire ... !!!

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Enfin ce que je tenais a faire remarquer c que les SGBD font ceci sans contrainte, par exemple, firebird ecrit une modification de ligne dans un fichier de base de donnée qui peut atteindre des disaine de GO sans pour autant faire un REWRITE a chaque insertion de RECORD.
    Car en piochant dans des forums anglophones, j'ai remarqué presque la meme réponse ;: Impossible d'inserer une ligne sans REWRITE complet du fichier en question !!! ce qui me parait bizzarre.

  3. #3
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    tu peux tout à fait accéder à ton fichier en binaire, utiliser seek() pour te positionner au bon endroit et écrire ta nouvelle chaîne.

    le problème c'est quand tu as une chaine "toto" que tu veux remplacer par "toto2", tu vas devoir insérer 1 caractère dans le fichier, et là pas de miracle, il faudra décaler toutes les données qui suivent.

    c'est pour cela que les zones d'une BDD sont généralement dimensionnées, un nom sur 40 caractères maxi, occupera toujours 40 caractères, quelque soit sa taille réelle, comme ça on a toujours la place pour le mettre à jour dans la limite de 40.
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Merci paul pour la réponse c réconfortant de savoir que je peut alors, donc vu que dans mon application je n'ai que le cas de figure suivant, remplacer une chaine de 50 caracteres par une autre de 50 aussi, donc ca ne devrait pas poser de probleme, pourrai tu me donner un exemple, si c possible bien sur,
    Merci

  5. #5
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par NorexaMS Voir le message
    Merci paul pour la réponse c réconfortant de savoir que je peut alors, donc vu que dans mon application je n'ai que le cas de figure suivant, remplacer une chaine de 50 caracteres par une autre de 50 aussi, donc ca ne devrait pas poser de probleme, pourrai tu me donner un exemple, si c possible bien sur,
    Merci
    peux tu déterminer la position de ta chaîne dans le fichier ?

    exemple x = TailleEntête + TailleLigne * NumeroLigne

    dans ce cas c'est simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var 
      f: TFileStream;
    begin
      f := TFileStream.Create(FileName, fmOpenWrite);
      try
        f.Position := x; // indiquer la position
        f.WriteBuffer(str[1], Length(Str)); // écrire la chaîne
      finally
       f.Free;
      end;
    end;
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    94
    Détails du profil
    Informations personnelles :
    Localisation : Algérie

    Informations forums :
    Inscription : Février 2009
    Messages : 94
    Par défaut
    Si ce n'est pas trop demander; et vu que je suis un peu ... noob quant a la manipulation des streams, peut tu donner un exemple sur :

    1. Ouverture d'un fichier
    2. Lecture de la ligne n°14 par exemple,
    3. Récupération de sa taille et de son contenu
    4. Ecriture d'une nouvelle chaine avec la meme taille a la place de la Ligne N°14

    J'ai beau essayer depuis 17h00 jusqu'a maintenant a le faire en me basant sur ton exemple, Walou ... Ce serait vraiment, je ne sais pas quoi dire
    Merci d'avance paul

Discussions similaires

  1. Remplacer une ligne dans fichier txt !
    Par cincap dans le forum Débuter
    Réponses: 13
    Dernier message: 24/09/2013, 12h52
  2. [Librairies] Inserer lignes dans fichier RTF
    Par tit_oune dans le forum Bibliothèques et frameworks
    Réponses: 5
    Dernier message: 04/05/2012, 10h21
  3. ecrire a la ligne dans fichier texte.
    Par zulot dans le forum Langage
    Réponses: 7
    Dernier message: 12/09/2006, 12h02
  4. prb retour a la ligne dans fichier txt telecharge avec php
    Par supersonicblonde dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2006, 14h20
  5. [Unix KSH] Ajout caractère fin de ligne dans fichier
    Par -COil- dans le forum Autres langages
    Réponses: 1
    Dernier message: 04/05/2006, 16h06

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