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

Delphi Discussion :

Insérer une ligne en mode binaire


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut Insérer une ligne en mode binaire
    Bonjours,
    Avant de commencer ma programmation j'aurai bien voulu d'abord avoir votre avis sur mon raisonnement de programmation si cette façon de le faire est correcte ou pas!
    Donc, pour le moment j'ai un fichier texte qui peux être très gros (90..MB) et à des moments je dois inserer par exemple à la ligne 1700, une nouvelle ligne texte + CRLF. ou tout simplement modifier cette ligne!
    Voilà comment j'ai voulu réaliser, tout simplement de faire une boucle, rechercher le nombre CRLF jusqu'a 1700, si No_CRLF est atteins alors rentre dans la condition pour ajouter ou modifier la ligne 1700, après recopie tout le reste au fichier destination.
    Puis effacer le fichier source et renommer le fichier destination en fichier source.
    Le seul souci que je vois est que si je prends par exemple la ligne 47000 tout cela peut prendre beaucoup de temps, car il faut passer du début ligne à la ligne 47000...
    Merci beaucoup de me guider...
    Voici un peut prés mon idée de programation.

    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
    21
    22
    23
    24
    25
    26
    27
     
    OpenDialog1_Execute :=  'MonFichier1.txt';
    SaveDialog1_Execute :=  'MonFichier2.txt';
     
    repeat
    BlockRead();
     
      TempStr1 := Copy()// copy la ligne jusque CRLF dans une variable
     
      no_CRLF := no_CRLF +1; // incremente le nombre de ligne expl. jusque 1700
      If no_CRLF = Edit1.text then
      begin
     
        InputQuery('Modifier la ligne expl 1700);
        // Si pas modifier ajoute une nouvelle ligne 
        ..
         InputQuery('Ajouter une nouvelle ligne);
         // ajouter une nouvelle Ligne..
         ..
        end;
         Seek(Source,Length(TempStr1)+..) // se position au prochain CRLF
         ..
     BlockWrite(); // -> 'MonFichier2.txt'
    until (NumRead = 0) ;
    CloseFile(F);
    Erase(F) // MonFichier1.txt
    Rename(F) // 'MonFichier2.txt' -> 'MonFichier1.txt'
    Salutations
    Ardely

  2. #2
    Expert confirmé
    Avatar de qi130
    Homme Profil pro
    Expert Processus IT
    Inscrit en
    Mars 2003
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France

    Informations professionnelles :
    Activité : Expert Processus IT
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2003
    Messages : 3 932
    Par défaut
    L'approche logique semble correcte.

    Par contre si j'avais à le programmer, j'utiliserais ReadLn plutôt que BlockRead, évitant ainsi la recherche du CRLF dans les données acquises.

    Quant à "l'optimisation", elle est fortement compromise du fait de la lecture séquentielle obligatoire, sauf si toutes les lignes sont de même longueur. Alors, dans ce cas, on peut se positionner directement dans le fichier.
    Cependant, ça ne résoud pas l'insertion (le début du fichier n'ayant pas été lu).

  3. #3
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 932
    Billets dans le blog
    6
    Par défaut
    tes lignes sont-elles de longueur fixe ?
    sinon, utilité de TextFile et ReadLn (lent et ne permet pas l'insertion)
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  4. #4
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    Non, mes longueurs ne sont pas de longueur fixe.
    Mais si je les mettrais en longueur fixe quelle avantage..à part que la capacité
    pourrait augmenter considérablement.

  5. #5
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    Bonjour,

    Y-a-t'il une certaine flexibilité pour formatter le fichier ?
    Par exemple :
    • les blancs de fin de ligne sont-ils significatifs ?
    • pourrais-t'on introduire des lignes "bidon" d'ajustement en début ou fin de
      de bloc ?

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Des longueurs fixe dans tes lignes te permetterais
    dans les faits de te positionner rapidement dans le fichier.
    si une ligne=120 carateres(CR+LF inclus), on peut dire que la ligne 500 est
    à la position (120*500)=60000.
    donc, un deplacement de 60000 dans le fichier avec FileSeek() te positionne correctement.

    C'est plus rapide que lire "les moins de caractère que tu as présentement"
    et de chercher 500 fois l'occurence de CR+LF.
    Cette recherche est probablement la plus couteuse en temps CPU dans le code que tu à énoncé.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

  7. #7
    Membre éclairé
    Inscrit en
    Novembre 2006
    Messages
    321
    Détails du profil
    Informations forums :
    Inscription : Novembre 2006
    Messages : 321
    Par défaut
    A bon je vois maintenant l'astuce de la longueur fixe, il faudra juste faire attention que cette ligne ne dépasse jamais cette longueur!
    Dois-je aussi toujours garder l'idée de procéder de copier tout le fichier vers un autre fichier destination, effacé l'original et puis renommer le fichier destination!
    Je philosophe peut-être un peut, mais une façon de chercher la No ligne couper puis coller le reste a la destination, sa existe!

  8. #8
    Membre émérite

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    582
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Mai 2003
    Messages : 582
    Par défaut
    Si tu veux loader tout le fichier en memoire, aucun probleme...
    vite dans les airs..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
        slFichier:=TStringList.Create;
        try
            slFichier.LoadFromFile(Fichier1);
            if Mode=Modif then slFichier.Strings[NumeroLigne-1,NewStr);
            if Mode=Insert then slFichier.Insert(NumeroLigne-1,NewStr);
            slFichier.SaveToFile(Fichier1);
        finally
            slFichier.Clear;
            slFichier.free;
        end;
    Ca serait le plus simple je crois. Mais bon encore je lis et écris tout
    le fichier.

    sinon...
    - Trouve la bonne position et la mémorise
    - Lecture dans un BigBuffer du restant du fichier
    - Modif du BigBuffer
    - Retour à Position mémorisé dans le fichier
    - Ecrire le BigBuffer par dessus
    Bon..quelque chose du genre...
    plus la modif est vers la fin du fichier, plus c'est rapide.
    Comment dupliquer un disque...ça vous intéresse?
    Tutoriel et code source delphi ici

Discussions similaires

  1. insérer une ligne dans un dbgrid entre 2 enregistrements
    Par bertrand_declerck dans le forum Bases de données
    Réponses: 3
    Dernier message: 22/09/2005, 09h15
  2. [VBA] insérer une ligne dans un fichier excel
    Par cokinoumasterflash dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 21/07/2005, 18h52
  3. Réponses: 2
    Dernier message: 07/07/2005, 11h47
  4. Insérer une ligne automatiquement dans une autre tab
    Par davyd dans le forum Langage SQL
    Réponses: 10
    Dernier message: 29/03/2005, 17h08
  5. [VBA][Excel]Insérer une ligne
    Par loverdose dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 18/02/2005, 16h27

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