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 :

Parcourir un fichier texte sans charger le fichier


Sujet :

Delphi

  1. #81
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    A titre pratique, tu peux utiliser IndexOf poour déterminer si une chaîne de caractères se trouve déjà dans la TStringList. Remarque que cela n'accélérera pas ton traitement, mais le code est plus simple.
    ok merci, c'est vrai que la j'ai reinvente la roue..

    Cela ne résoud pas le problème de la taille des données.
    tu as une solution meilleure que de lire une ligne l'une apres l'autre? (je prend)

  2. #82
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    j'ai mieux encore:

    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
      for i := 0 to fichiers.Count-1 do begin
     
        lignes.Clear();
     
        AssignFile( fich, fichiers[i] );
        Reset( fich );
     
        while not Eof(fich) do begin
           ReadLn( fich, s );
     
           if lignes.IndexOf( s ) > -1 then begin
            memo1.Lines.Add( 'le fichier '+fichiers[i]+' contient un ou plusieurs doublon(s)' );
            break;
           end;
     
           lignes.Add(s);
     
        end;
    a quoi sert ton try?

  3. #83
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    A Art19 :

    Merci pour le code finalement retenu ... mais en le comparant à celui qui est joint à ton message du 25/05/2007, 20h25 on constate que c'est exactement le même qu'au début de la discussion et que le problème initial n'est pas vraiment résolu.

    ...... donc on peut continuer à chercher les diverses possibilités d'optimisation.

    Bon c'est confirmé que "dès qu'il y a un doublon je sors de ma boucle"

    Par contre pour continuer à optimiser, vu qu"en pratique c'est quand meme tres lent!" ce serait sympa de nous en dire un peu plus sur la structure-probable-des-fichiers-concernés par la recherche des 1ers doublouns cela nous permettrait au moins de pouvoir créer un fichier-de-tests qui correspondrait le mieux aux fichiers concernés car à-taille-égale un fichier dont les lignes font seulement 7 caractères maxi cela donne X-mille-lignes alors que si en réalité ce même fichier était caractérisé par des lignes de longueur comprise aléatoirement entre 0 et 280 caractères maxi cela donnerait grossomodo un fichier de seulement ((X-Mille-lignes) fois 7/280) ... et comme les lenteurs diminuent surtout en fonction du nombre de lignes cela permettrait de mieux faire coller les tests à la réalité à la fois pour ce qui est de la quantité-minimale-d'infos à placer en mémoire et pour ce qui est des vitesses.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  4. #84
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    De plus, nous sommes tous partis pour code via TStream ou API Windows pour gérer des fichiers de plus de 2Go ... et si le AssignFile suffit c'est que c'est moins de 2Go ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #85
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    voila le type de fichiers:

    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
    10/03/05,17:04,0.87,0.87,0.87,0.87,1
    10/04/05,17:04,0.87,0.87,0.87,0.87,1
    10/05/05,16:04,0.86,0.86,0.86,0.86,1
    10/06/05,16:04,0.86,0.86,0.86,0.86,1
    10/07/05,16:03,0.87,0.87,0.87,0.87,1
    10/10/05,16:04,0.87,0.87,0.87,0.87,1
    10/11/05,16:03,0.86,0.86,0.86,0.86,1
    10/12/05,16:04,0.87,0.87,0.87,0.87,1
    10/13/05,16:04,0.86,0.86,0.86,0.86,1
    10/14/05,16:03,0.86,0.86,0.86,0.86,1
    10/17/05,16:05,0.86,0.86,0.86,0.86,1
    10/18/05,16:05,0.86,0.86,0.86,0.86,1
    10/19/05,16:05,0.86,0.86,0.86,0.86,1
    10/20/05,16:05,0.86,0.86,0.86,0.86,1
    10/21/05,16:03,0.86,0.86,0.86,0.86,1
    10/24/05,16:05,0.86,0.86,0.86,0.86,1
    10/25/05,16:04,0.86,0.86,0.86,0.86,1
    10/26/05,16:04,0.87,0.87,0.87,0.87,1
    10/27/05,16:04,0.87,0.87,0.87,0.87,1
    10/28/05,16:04,0.86,0.86,0.86,0.86,1
    Le AssignFile ne marche pas au dessus de 2Go?

  6. #86
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Bon on avance :
    10/10/05,16:04,0.87,0.87,0.87,0.87,1
    ... et peut on en déduire que la longueur de chaque chaine est non seulement constante dans un même fichier mais égale à la précédente dans tous les fichiers à ausculter ?

    - "AssignFile ne marche pas au dessus de 2Go?" : Sur ce point je fais confiance à ShailLeTroll n'ayant pas trouvé immédiatement dans l'aide ... mais la pratique révèle en plus qu'il y a pas mal de problèmes de lenteur qui peuvent être améliorés avec un FileStream associé à un buffer de taille appropriée pour aspirer en mémoire le minimum de données utiles, donc faut pas s'en priver.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  7. #87
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Bon, il semble que j'arrive à générer un fichier de 4Go, ce qui est la limite c'est sur car c'est géré sur des cardinals et que les fonctions liés au file pascal ne gère pas la partie High dans SetFilePointer, suffit de voir le code du Seek dans fichier pascal

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    PUSH     FILE_BEGIN    // pass dwMoveMethod
            MOV      EAX,[ECX].TFileRec.RecSize
            MUL      EDX
            PUSH     0           // pass lpDistanceToMoveHigh
            PUSH     EAX           // pass lDistanceToMove
            PUSH     [ECX].TFileRec.Handle   // pass hFile
            CALL     SetFilePointer          // get current position
    Sinon ton fichier, si il est TOUJOURS comme cela, on pourrait un fichier binaire avec un enregistrement de taille 36+2 (si toujours CR+LF), ainsi la lecture serait plus rapide, ... cela me fait penser aux des fichiers EURUSD de FOREXMATRIX, un projet d'un membre du forum pour la gestion des taux de change ...

    Donc oui, ton fichier pourrait-être bien plus efficacement en position fixe qu'en fichier texte en ligne ...
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  8. #88
    Membre averti
    Inscrit en
    Octobre 2005
    Messages
    338
    Détails du profil
    Informations forums :
    Inscription : Octobre 2005
    Messages : 338
    Points : 383
    Points
    383
    Par défaut
    bonjour

    si tous les fichiers ont la même structure, et que les enregistrements sont bien triés par date/heure, il n'y a plus besoins de Tstringlist ou autre, il suffit de comparer par rapport à la ligne précédente!!

    mais ça doit être trop simple..

    à plus

  9. #89
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    Les fichiers suivent toujours plus ou moins ce modele mais le nombre de caracteres par ligne peut varier. Il ne faut avoir aucun a priori sur la forme du fichier. Tout ce qu'on sait c'est qu'on va avoir un truc du type:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    date, heure, champ1, champ2, ..., champN
    date, heure, champ1, champ2, ..., champN
    ...
    date, heure, champ1, champ2, ..., champN

  10. #90
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    si tous les fichiers ont la même structure, et que les enregistrements sont bien triés par date/heure, il n'y a plus besoins de Tstringlist ou autre, il suffit de comparer par rapport à la ligne précédente!!

    mais ça doit être trop simple..
    oui car les fichiers ne sont pas tries justement

  11. #91
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 559
    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 559
    Points : 3 946
    Points
    3 946
    Par défaut
    Citation Envoyé par Art19
    a quoi sert ton try?
    à garantir la fermeture du fichier (CloseFile)

    cdlt

    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."

  12. #92
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Je suis en train de générer un gros fichier, j'ai écrit 10*066*330*800 octets en écriture simple, je n'ai pas testé si il est possible de lire tout cela mais semble que cela fonctionne avec une lecture normale, la limite des 4Go ne concerne que le SEEK

    effectivement le try est mal placé

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        AssignFile( fich, fichiers[i]);
        try
          Reset( fich );
          while not Eof(fich) do 
          //....
          end;
        finally
          CloseFile(fich);
        end;
    le CloseFile n'est pas le pendant à AssignFile mais à Reset, Rewrite ou Append

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
        AssignFile( fich, fichiers[i]);
        Reset( fich );
        try
          while not Eof(fich) do 
          //....
          end;
        finally
          CloseFile(fich);
        end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  13. #93
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date, heure, champ1, champ2, ..., champN
    ... et dans "champ1, champ2, ..., champN" a-t-on une idée sur la valeur max du "N" dans champN" ???
    ... En bref, Nmax c'est un Byte, un ShortInt ou davantage ??
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  14. #94
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    N est le meme pour tout le fichier mais il peut varier d'un fichier a un autre. Le Nmax doit etre < 10

  15. #95
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Il se pourrait que la limite des 4Go concerne le EOF du fichier binaire, pour le fichier texte, je n'arrive pas à comprendre l'ASM pour savoir si il y aurait aussi cette limite, je n'ai jamais utilisé ReadLn pour de si gros fichier mais BlockRead (petit fichier) ou ReadFile (gros fichier)

    Si le fichier est variable, la considération de la longueur de chaine n'est plus importante ....
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  16. #96
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    oui mais avec ReadFile tu load quelle taille?

  17. #97
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Si "Le Nmax doit etre < 10" on peut en déduire quand même une longueur maxi de chaine pour un 1er fichier-de-tests et un 2ème fichier-de-tests avec Nmini=1. Non ? Histoire de pouvoir faire des tests aux conditions-limites.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  18. #98
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Citation Envoyé par Art19
    oui mais avec ReadFile tu load quelle taille?
    ReadFile c'est avec un Int64, donc cela dépasse le Yota Octets ... (10^24)
    Virtuellement infini ... mais aura tu plus de 4Go ?
    Pour info ReadFile c'est l'API Windows, par habitude j'utilise SysUtils.FileRead qui n'est qu'une encapsulation de Windows.ReadFile
    De plus le TFileStream utilise SysUtils.FileRead
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  19. #99
    Modérateur

    Homme Profil pro
    Ingénieur retraité
    Inscrit en
    Octobre 2005
    Messages
    2 396
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur retraité

    Informations forums :
    Inscription : Octobre 2005
    Messages : 2 396
    Points : 3 263
    Points
    3 263
    Par défaut
    Au fait Art19, dans ton message du 25/05/2007, 19h48 tu précises que "gros fichier" = "plusieurs Giga" ... Giga c'est clair, mais "plusieurs" c'est combien au maxi, car "plusieurs" cela commence à 2 mais on ne sait pas où cela s'arrête ???

    Tiens ShailLeTroll a été plus rapide que moi à poser la même question.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  20. #100
    Membre régulier
    Profil pro
    Inscrit en
    Juin 2005
    Messages
    210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 210
    Points : 84
    Points
    84
    Par défaut
    max 10Go mais c'est pure precaution parce que je ne rencontre pas plus que 2Go pour l'instant

Discussions similaires

  1. [XL-2010] Copier le contenu d'un fichier texte dans un autre fichier texte
    Par Piixx_e dans le forum Macros et VBA Excel
    Réponses: 29
    Dernier message: 15/11/2013, 11h31
  2. copier plusieurs fichiers texte dans un seul fichier texte
    Par ERICKO dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 17/08/2008, 20h21
  3. Imprimer un fichier texte sans l'afficher
    Par sheira dans le forum ASP
    Réponses: 7
    Dernier message: 13/12/2005, 12h10
  4. charger un fichier texte du disque dur
    Par frol dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2005, 17h09
  5. Fichiers texte sans accents
    Par mika dans le forum Langage
    Réponses: 5
    Dernier message: 03/11/2004, 16h42

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