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 :

Compter le nombre de lignes d'un fichier ?


Sujet :

Delphi

  1. #1
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut Compter le nombre de lignes d'un fichier ?
    Bonjour,

    Existe-t-il une fonction qui permet de calculer le nombre de lignes d'un fichier ?

    Sinon, quelle méthode utiliser afin de calculer ce nombre de manière optimisée ?

    Merci,
    ZiP

  2. #2
    rbh
    rbh est déconnecté
    Membre confirmé Avatar de rbh
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    381
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Janvier 2004
    Messages : 381
    Points : 471
    Points
    471
    Par défaut
    Salut
    De manière optimisé, je ne sais pas, mais de manière rapide (en nombre de ligne de code) tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Fonction NbLigne(Filename: string): integer;
    var
      SL: TStringList;
    begin
      SL := TStringList.create;
      SL.LoadFromFile(FileName);
      Result := SL.count;
      FreeAndNil(SL);
    end;

  3. #3
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    Je vais essayer ça en espérant que le TStringList accepte un gros volume de lignes.

    Mon fichier fais environ 650 000 lignes.

    Merci,
    ZiP

  4. #4
    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 est clair qu'avec une TStringList pour un fichier d'un tel volume, cela sera extrément lent et couteux en mémoire (il charge les 650 000 string dans un tableau de string)

    tu peux utiliser un TextFile, avec ReadLn, ... ça serait plus rapide ...

    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
    procedure TFrmTestFichier.BtnCountLineInFileClick(Sender: TObject);
    var
      FLNC: TextFile;
      CountLn: Integer;
    begin
      CountLn := 0;
      AssignFile(FLNC, EdPathSearch.Text);
      Reset(FLNC);
      try
        while Eof(FLNC) do
        begin
          Inc(CountLn);
          Readln(FLNC);
        end;
      finally
        CloseFile(FLNC);
      end;
      ShowMessage(IntToStr(CountLn));
    end;

    Sinon, j'ai bricolé, une fonction de recherche à l'instant, ça me changeait des travaux simplissimes du bureau ... j'ai testé sur un fichier de 105000 lignes (107*730*000 octets)
    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. #5
    Membre averti
    Homme Profil pro
    Paramétreur de progiciels
    Inscrit en
    Octobre 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Paramétreur de progiciels

    Informations forums :
    Inscription : Octobre 2006
    Messages : 970
    Points : 381
    Points
    381
    Par défaut
    Bonjour,

    OK

    Merci,
    ZiP

  6. #6
    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
    Tient, j'ai une envie de pondre ça aussi, bon, les offsets ne doivent pas être terrible, mais au moins ça compte correctement, et surtout plus vite (35% gagné)

    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
    function SearchStringInFile(const FileName, SearchString: string; out OffSets: TCardinalDynArray): Integer;
    const
       BUF_SIZE: Integer = 1024;
    var
       FileToSearch: file;
       SearchBuf: array of Char;
       iSearchBufPos, iSearch, iMark, iCountFound, iRememberFound, iReaded: Integer;
       SearchLen: Integer;
       AmtTransferred: Integer;
    begin
       SetLength(SearchBuf, BUF_SIZE);
       SearchLen := Length(SearchString);
     
       Result := 0;
       iReaded := 0;
       AssignFile(FileToSearch, FileName);
       try
          Reset(FileToSearch, 1);
          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 SearchBuf[iSearch] = SearchString[iMark] then
                   begin
                      Inc(iCountFound);
     
                      if iCountFound >= SearchLen then
                      begin
                         Inc(Result);
                         SetLength(OffSets, Length(OffSets) + 1);
                         OffSets[High(OffSets)] := iReaded + iSearchBufPos;
                         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;
    end;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    procedure TFrmTestFichier.BtnCountStringInFileClick(Sender: TObject);
    var
      OffSets: TCardinalDynArray;
    begin
      ShowMessage(IntToStr(SearchStringInFile(EdPathSearch.Text, EdSearchString.Text, OffSets)));
    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

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

Discussions similaires

  1. Compter le nombre de lignes d'un fichier!
    Par toutounesan dans le forum C++
    Réponses: 11
    Dernier message: 20/09/2007, 11h21
  2. Réponses: 9
    Dernier message: 03/06/2007, 10h53
  3. Compter le nombre de ligne dans un fichier
    Par amine_en_france dans le forum Scripts/Batch
    Réponses: 2
    Dernier message: 31/05/2007, 17h19
  4. Compter le nombre de lignes d'un fichier excel
    Par Freerideuse dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 06/07/2006, 21h49
  5. Réponses: 2
    Dernier message: 02/03/2004, 19h38

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