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
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
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;
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
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
Bonjour,
OK
Merci,
ZiP
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
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager