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. #21
    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 Sjrd / Fichier IntegerList.pas de CapJack:

    "Avec le lien direct c'est plus facile" : Oui-mais j'étais tellement content de l'avoir retrouvé via la fonction rechercher que j'avais peur de m'embrouiller avec une manip que je n'ai encore jamais faite et comme le copier/coller est quasi-universel j'ai pris cette combine. En tout cas, merci d'avoir ajouté le lien ici.

    "À première vue, je pense que son code est plus efficace" : Je viens à l'instant d'en faire une tentative de test d'utilisation, mais Delphi-5 n'est pas d'accord il dit [Erreur fatale] IntegerList.pas(13): Fichier non trouvé : 'RTLConsts.dcu' ... il manque le fichier de l'unité RTLConsts.pas.
    Mais comme dans son message du 23/04/2007, 19h17, CapJack écrit "Mon source aurait peut-être sa place quelque part sur le site, ..." peut-être qu'il nous donnera ce 2ème fichier.

    Par contre pour la compréhension de IntegerList on n'est pas trop dépaysé vu que le vocabulaire employé pour les définitions des routines publiques est pour l'essentiel le même que pour le TStringList ( Add, Delete, IndexOf, etc) et en prime il y a diverses possibilités de tri et des fonctions de calcul (Maxi, Mini, Moyenne, etc).
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  2. #22
    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 Waskol :

    "C'est pas un que j'ai posté sur le forum par hasard ?" : Visiblement non puisque j'ai retrouvé ce code dans la pièce jointe d'un message rédigé par CapJack.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  3. #23
    Expert éminent sénior

    Avatar de sjrd
    Homme Profil pro
    Directeur de projet
    Inscrit en
    Juin 2004
    Messages
    4 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : Suisse

    Informations professionnelles :
    Activité : Directeur de projet
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2004
    Messages : 4 517
    Points : 10 154
    Points
    10 154
    Par défaut
    RTLConsts est une des unités standart de Delphi. Si elle n'est pas disponible sous Delphi 5, essaye Consts tout court à la place.
    sjrd, ancien rédacteur/modérateur Delphi.
    Auteur de Scala.js, le compilateur de Scala vers JavaScript, et directeur technique du Scala Center à l'EPFL.
    Découvrez Mes tutoriels.

  4. #24
    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
    Merci Sjrd la parade semble être bonne car un test de compilation à vide n'a pas déclenché l'envoi d'un message d'erreur ... signe encourageant pour se lancer dans le bidouillage d'un code pour tester le fonctionnement.
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

  5. #25
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    J'étais pas dans le coin... si, RTLConsts est une unité standard, mais de Delphi 2005 ! Elle contient les chaînes localisées, entre autres les messages d'erreur SListIndexError, SListCapacityError et SListCountError, et s'appelait effectivement Consts.pas dans les versions antérieures de Delphi. A la rigueur, vu que j'ai rajouté des messages d'erreur en français, autant virer la référence à RTLConsts.pas et ajouter en constantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          SListIndexError       = 'Indice de liste hors limite (%d)';
          SListCapacityError    = 'Capacité de liste hors limites (%d)';
          SListCountError       = 'Compte de liste hors limites (%d)';
    On pourrait aussi mettre une directive de compilation conditionnelle, mais j'ai la flemme... en plus, je ne sais pas à partir de quelle version de Delphi il faut remplacer Const.pas par RTLConst.pas !


    Par ailleurs, s'agissant de mon unité IntegerList.pas, je l'ai créée en m'inspirant du code source du TList de Delphi 3, dont j'avais une version pro avant de passer à Delphi 2005. Je l'ai utilisée et améliorée pendant des années, normalement elle est parfaitement exempte de bugs. Si ça vous intéresse, j'ai aussi une TInt64List, une TSingleList, une TDoubleList, une TExtendedList, une TByteList, une TTColorList, et je peux même créer autant de listes du même genre que vous voulez, grâce à un utilitaire perso.

  6. #26
    Expert éminent sénior
    Avatar de Cl@udius
    Homme Profil pro
    Développeur Web
    Inscrit en
    Février 2006
    Messages
    4 878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2006
    Messages : 4 878
    Points : 10 008
    Points
    10 008
    Par défaut
    Citation Envoyé par CapJack
    On pourrait aussi mettre une directive de compilation conditionnelle, mais j'ai la flemme... en plus, je ne sais pas à partir de quelle version de Delphi il faut remplacer Const.pas par RTLConst.pas !
    Sauf erreur de ma part cette unité est apparue avec Delphi7.
    En tout cas elle est bien présente avec D7.

    Il faudrait qu'un possesseur de D6 nous le confirme.

    @+

  7. #27
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par Gilbert Geyer
    A Waskol :

    "C'est pas un que j'ai posté sur le forum par hasard ?" : Visiblement non puisque j'ai retrouvé ce code dans la pièce jointe d'un message rédigé par CapJack.
    Tiens, mon post à déjà plus d'un an ! (message n°25)
    http://www.developpez.net/forums/sho...t=tintegerlist
    Bidouilleuse Delphi

  8. #28
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    D'après ce que j'ai lu, c'était aussi RTLConsts dans Delphi 6.

    En partant de cette hypothèse, code à rajouter après interface à la place de la clause uses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    {$IFDEF VER80 }{$DEFINE OLDVERSION}{$ENDIF D1    }
    {$IFDEF VER90 }{$DEFINE OLDVERSION}{$ENDIF D2    }
    {$IFDEF VER93 }{$DEFINE OLDVERSION}{$ENDIF BCB++1}
    {$IFDEF VER100}{$DEFINE OLDVERSION}{$ENDIF D3    }
    {$IFDEF VER110}{$DEFINE OLDVERSION}{$ENDIF BCB++3}
    {$IFDEF VER120}{$DEFINE OLDVERSION}{$ENDIF D4    }
    {$IFDEF VER125}{$DEFINE OLDVERSION}{$ENDIF BCB++4}
    {$IFDEF VER130}{$DEFINE OLDVERSION}{$ENDIF D5    }
     
    {$IFDEF OLDVERSION}
    uses SysUtils, Windows, Classes, Consts;
    {$ELSE}
    uses SysUtils, Windows, Classes, RTLConsts;
    {$ENDIF}
    Après implementation, à la place de la clause uses :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    {$IFNDEF OLDVERSION}
    uses Consts;
    {$ENDIF}

  9. #29
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par CapJack
    J'étais pas dans le coin... si, RTLConsts est une unité standard, mais de Delphi 2005 ! Elle contient les chaînes localisées, entre autres les messages d'erreur SListIndexError, SListCapacityError et SListCountError, et s'appelait effectivement Consts.pas dans les versions antérieures de Delphi. A la rigueur, vu que j'ai rajouté des messages d'erreur en français, autant virer la référence à RTLConsts.pas et ajouter en constantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
          SListIndexError       = 'Indice de liste hors limite (%d)';
          SListCapacityError    = 'Capacité de liste hors limites (%d)';
          SListCountError       = 'Compte de liste hors limites (%d)';
    On pourrait aussi mettre une directive de compilation conditionnelle, mais j'ai la flemme... en plus, je ne sais pas à partir de quelle version de Delphi il faut remplacer Const.pas par RTLConst.pas !


    Par ailleurs, s'agissant de mon unité IntegerList.pas, je l'ai créée en m'inspirant du code source du TList de Delphi 3, dont j'avais une version pro avant de passer à Delphi 2005. Je l'ai utilisée et améliorée pendant des années, normalement elle est parfaitement exempte de bugs. Si ça vous intéresse, j'ai aussi une TInt64List, une TSingleList, une TDoubleList, une TExtendedList, une TByteList, une TTColorList, et je peux même créer autant de listes du même genre que vous voulez, grâce à un utilitaire perso.
    Sur ma page perso, j'ai même un outil (pourri j'en convien) qui vous permet de creer n'imposte quel type de descendant de TList et de TObjectList.
    Bidouilleuse Delphi

  10. #30
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    A waskol : ton unité rejoint celle que j'avais faite il y a des années de ça. La démarche est naturelle. Mais si j'ai par la suite décidé de réécrire la liste entièrement, et pas à partir de TList, c'est parce que cette première méthode ne marche que pour les entiers, grâce à l'astuce qui veut qu'un Integer ait la même taille qu'un pointeur. Mais pour un TExtendedList ou un TInt64List, il fallait tout réécrire... en plus, ça m'a permis de comprendre pas mal de chose et d'ajouter pas mal de fonctionnalités.

  11. #31
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Je viens de jeter un oeil sur ton utilitaire. Pas si pourri que ça, mais c'est vrai qu'on peut mieux faire du point de vue de l'ergonomie...

    Mon utilitaire à moi, je ne l'ai jamais publié parce que je trouvais qu'il n'était pas au point. Mais si ça intéresse du monde... il est basé sur le principe des boucles avec des mots-clef (un peu comme Spip, mais bien avant lui : la première version doit dater de 97/98, par là).

    On crée un modèle d'unité, et il en bâtit autant qu'on en veut sur la base d'un tableau de valeurs assignées aux mot-clef. J'ai donc évidemment créé aussi des modèles pour cet utilitaire permettant de créer différents types de liste, de types record "en dur" ou record en pointeurs avec ou sans libération automatique, de type objet avec ou sans gestion automatique de la libération, etc... J'attendais d'avoir un bon composant éditeur de code source, d'avoir le temps de reprendre ça à tête reposée, et surtout d'écrire un mode d'emploi parce que c'est compliqué, avant de le publier, et puis ça ne s'est jamais fait.

  12. #32
    Membre actif Avatar de petitprince
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juillet 2006
    Messages
    322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juillet 2006
    Messages : 322
    Points : 267
    Points
    267
    Par défaut
    Ah oui, moi ça m'intéresse cet utilitaire dont tu nous parle...

  13. #33
    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
    Tiens, pendant le Week end, un sujet très intéressant, sur la manipulation de fichiers, hum, à part l'écart sur les T*List, faudrait aider Art19

    voici ma fonction qui permet de chercher dans un fichier la présence d'une chaine et renvoie le nombre d'occurence trouvé, ainsi qu'optionellement un tableau (en out) qui contiendra les offsets dans le fichier ... je l'ai massivement utilisé pour un robot qui modifie des fichiers .pas au bureau.

    Un Algo primitif consiterait à chercher ligne par ligne du fichier voir si il y a des doublons (via SearchStringInFile), cela serait affreusement couteux en temps ...

    Si j'ai le temps, je vais aussi pondre une algo comme celui de CapJack qui m'a l'air déjà bien intéressant, mais qui avec une bufferisation serait nettement plus efficace pour la recherche des lignes, tout en incluant l'idée de Gilbert Geyer

    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    {* -----------------------------------------------------------------------------
    la Fonction SearchStringInFile Permet de Chercher une Chaine dans Fichier, la fonction renvoi le nombre d'occurence, et peu renvoyer un tableau contenant le premier octet de chaque occurence dans le fichier
    @param FileName Chaine contenant le nom du Fichier
    @param SearchString Chaine à chercher dans le fichier
    @param OffSets Tableau d'Entier qui contiendra les positions de occurences trouvés
    @param KeepOffSet Boolean True rempli OffSets, False, ne rempli pas OffSets
    @return Nombre d'occurence Trouvé
    ------------------------------------------------------------------------------ }
    function SearchStringInFile(const FileName: string; SearchString: string; out OffSets: TIntegerDynArray; KeepOffSet: Boolean = False; CaseSensitive: Boolean = True): Integer;
    const
       BUF_SIZE: Integer = 1024;
    var
       FileToSearch: file;
       SearchBuf: array of Char;
       iSearchBufPos, iSearch, iMark, iCountFound, iRememberFound, iReaded: Integer;
       SearchLen: Integer;
       AmtTransferred: Integer;
       FileModeCopy: Byte;
    begin
       Result := 0;
       iReaded := 0;
     
       SetLength(SearchBuf, BUF_SIZE);
       SearchLen := Length(SearchString);
       if not CaseSensitive then
         SearchString := SysUtils.UpperCase(SearchString);
     
       FileModeCopy := FileMode;
       FileMode := SysUtils.fmOpenRead;
       try
         AssignFile(FileToSearch, FileName);
         Reset(FileToSearch, 1);
         try
            iCountFound := 0;
     
            while not Eof(FileToSearch) do
            begin
               BlockRead(FileToSearch, SearchBuf[0], BUF_SIZE, AmtTransferred); // [0] parce que c'est un tableau dynamique
               iRememberFound := iCountFound;
               iSearchBufPos := 0;
     
               while iSearchBufPos < AmtTransferred do
               begin
                  // Comparaison Octet par Octet de la chaine recherchée
                  for iMark := iCountFound + 1 to SearchLen do
                  begin
                     iSearch := iSearchBufPos + iMark - iRememberFound - 1;
                     if iSearch >= AmtTransferred then
                        Break;
     
                     if (CaseSensitive and (SearchBuf[iSearch] = SearchString[iMark]))
                     or (not CaseSensitive and (UpCase(SearchBuf[iSearch]) = SearchString[iMark])) then
                     begin
                        Inc(iCountFound);
     
                        if iCountFound >= SearchLen then
                        begin
                           Inc(Result);
                           if KeepOffSet then
                           begin
                              SetLength(OffSets, Length(OffSets) + 1);
                              OffSets[High(OffSets)] := iReaded + iSearchBufPos - iRememberFound;
                           end;
                           iCountFound := 0;
                           iRememberFound := 0;
                           Break;
                        end;
                     end else begin
                        iCountFound := 0;
                        iRememberFound := 0;
                        Break;
                     end;
                  end;
                  Inc(iSearchBufPos, iCountFound + 1);
               end;
               Inc(iReaded, AmtTransferred);
            end;
         finally
            CloseFile(FileToSearch);
         end;
       finally
         FileMode := FileModeCopy;
       end;
    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

  14. #34
    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
    @ Cl@udius

    pour info
    j'ai D6 pro et quand je met RTLConsts dans ma clause Uses, je n'ai pas de message d'erreur à la compilation

    à plus

  15. #35
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Sinon, une autre idée : pourquoi ne pas calculer une somme de contrôle judicieuse sur chaque chaîne ? Si deux sommes sont différentes cela signifie que les deux chaînes le sont, sinon on vérifie quand même. Ainsi on gagne en espace mémoire, en temps de calcul, et c'est plus efficace que simplement la longueur des chaînes (après tout, elles ont peut-être toutes la même longueur ?). Quoiqu'on pourrait combiner les deux.

  16. #36
    Membre éprouvé
    Avatar de CapJack
    Homme Profil pro
    Prof, développeur amateur vaguement éclairé...
    Inscrit en
    Mars 2004
    Messages
    624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Prof, développeur amateur vaguement éclairé...
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 624
    Points : 988
    Points
    988
    Par défaut
    Citation Envoyé par petitprince
    Ah oui, moi ça m'intéresse cet utilitaire dont tu nous parle...
    Ce n'est pas publiable en l'état, mais je vais voir ce que je peux faire.

  17. #37
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par CapJack
    Ce n'est pas publiable en l'état, mais je vais voir ce que je peux faire.
    Sous la pression des fans, je l'eu fait, et pourtant, tu as bien vu la de mon machin !



    T'inquiète, tout le monde s'en contentera !
    Bidouilleuse Delphi

  18. #38
    Membre expert
    Avatar de LadyWasky
    Femme Profil pro
    Inscrit en
    Juin 2004
    Messages
    2 932
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 53
    Localisation : France, Hauts de Seine (Île de France)

    Informations forums :
    Inscription : Juin 2004
    Messages : 2 932
    Points : 3 565
    Points
    3 565
    Par défaut
    Citation Envoyé par CapJack
    Je viens de jeter un oeil sur ton utilitaire. Pas si pourri que ça, mais c'est vrai qu'on peut mieux faire du point de vue de l'ergonomie...

    Mon utilitaire à moi, je ne l'ai jamais publié parce que je trouvais qu'il n'était pas au point. Mais si ça intéresse du monde... il est basé sur le principe des boucles avec des mots-clef (un peu comme Spip, mais bien avant lui : la première version doit dater de 97/98, par là).

    On crée un modèle d'unité, et il en bâtit autant qu'on en veut sur la base d'un tableau de valeurs assignées aux mot-clef. J'ai donc évidemment créé aussi des modèles pour cet utilitaire permettant de créer différents types de liste, de types record "en dur" ou record en pointeurs avec ou sans libération automatique, de type objet avec ou sans gestion automatique de la libération, etc... J'attendais d'avoir un bon composant éditeur de code source, d'avoir le temps de reprendre ça à tête reposée, et surtout d'écrire un mode d'emploi parce que c'est compliqué, avant de le publier, et puis ça ne s'est jamais fait.
    c'est donc exactement le même principe que ma, hum, chose qui elle aussi date de l'age de pierre
    Bidouilleuse Delphi

  19. #39
    Membre émérite Avatar de edam
    Homme Profil pro
    Développeur Delphi/c++/Omnis
    Inscrit en
    Décembre 2003
    Messages
    1 894
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Développeur Delphi/c++/Omnis
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 1 894
    Points : 2 771
    Points
    2 771
    PAS DE DESTIN, C'EST CE QUE NOUS FAISONS

  20. #40
    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
    CapJack a écrit :
    Sinon, une autre idée : pourquoi ne pas calculer une somme de contrôle judicieuse sur chaque chaîne ? Si deux sommes sont différentes cela signifie que les deux chaînes le sont...
    Ainsi on gagne en espace mémoire, en temps de calcul, et c'est plus efficace que simplement la longueur des chaînes (après tout, elles ont peut-être toutes la même longueur ?). Quoiqu'on pourrait combiner les deux.
    1) "calculer une somme de contrôle judicieuse sur chaque chaîne" : Une telle somme nécessiterait de tenir compte de tous les caractères de chaque chaine. Or lorsque dans un algo on fait par exemple if string1=string2 et que :
    - string1 = azote
    - string2 = azzzzzzzzzzz......zzzzzzzzzzzz
    le curseur de comparaison des chaines commence sur le a , passe au z et s'arrête sur la différence o/z, c.à.dire dès le caractère, quelle que soit la longueur de string2. Non?
    Il faudrait de surcroît que cette somme de contrôle soit vraiment judicieuse au point de pouvoir être caculée sur chaque chaîne avant de rentrer dans la moulinette de comparaison de ces sommes... mais c'est pas interdit de cogiter sur la recherche d'astuces.

    2) "après tout, elles ont peut-être toutes la même longueur ?" : Peut être pas toutes mais un bonne proportion ... plus un fichier grossit et plus il ya des chances que le nombre de lignes-de-même-longueur augmente.
    Dans l'exemple suivant le fichier Doublons2.txt utilisé pour des tests est une copie d'un fichier où il a été accumulé des bouts de textes comparables à des recettes de cuisine et saisis il y a fort longtemps (c'est à dire que ce n'est pas un fichier créé spécialement pour la recherche des doublons).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    c:\Doublons2.txt
    Taille : 8430718 Octets
     
    Nombre de lignes : 41221                   
     
    Après suppression lignes-vides : Reste = 27500 lignes non vides, soit 66% du total
     
    Après suppression lignes-sans-flag : Reste lignes de même longueur = 27408, soit 99.7 % des lignes-non-vides
    3) A propos de gains en temps de calcul : Je profite de ce message pour signaler à CapJack que son code pour la recherche de doublons peut être amélioré en remplacant les var k:Char; et les S.Read(k,SizeOf(k)); (qui font de la lecture de flux caractère par caractère) par un var buffer : array [0..4096] of char; puis un lu:=S.Read(buffer,SizeOf(buffer)); qui aspirent les 4096 caractères d'un coup et qui sont nettement plus rapides. (ayant fait la même erreur avec ma routine "RelevéTopographiqueDuFichier" la vitesse d'exécution de cette étape s'est ainsi touvée multipliée par 43 et ne constitue plus le goulot d'étranglement. C'est dans les suites de nos codes que ça va freiner à partir du moment où l'on commence par comparer dans des boucles imbriquées chaque ligne à toutes ses suivantes ... et comme en plus ce nombre de comparaisons (et les temps d'éxécution) augmente(nt) proportionellement au carré du nombre de lignes on n'est pas sorti de l'auberge des ralentissements ... sans oublier que dans son message du 25/05/2007, 19h48, Art19 signale dans une parenthèse qu'il entend par gros fichier un fichier de "plusieurs Giga" ... "Giga" c'est déjà gros mais "plusieurs" ça commence à partir de 2 ... et ça s'arrête à combien ?
    A+
    N'oubliez pas de consulter les FAQ Delphi et les cours et tutoriels Delphi

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