Gambas France BETA


Pas de compte ? Incription

Compter lignes dans un fichier text

Ce sujet est résolu.

12
AuteurMessages
Foromus#1 Posté le 10/1/2023 à 16:58:52
Bonjour à tous,

Voilà que je bloque sur un truc tout bête : compter les lignes dans un fichier text.
J'ai un fichier où je rajoute des lignes au fur et à mesure des besoins (append), et je voudrais savoir combien il a de lignes à un moment donné.
J'ai tenté une
1
2
3
4
5
6
Open....
DO
LINE imput# Monfich
Nb += 1
LOOP UNTIL Monfich = ""
CLOSE

Mais ça plante...
valaquarus#2 Posté le 10/1/2023 à 17:17:24
-- Unus Ex Altera --Bonsoir Foromus,
1
2
3
4
DIM ceTexte AS STRING

TRY SHELL " cat " & FMain.historic & " | wc -l " TO ceTexte 'combien de lignes dans le fichier?
lNbrLigne = Val(ceTexte)

Ces deux lignes te permettes de compter le nombre de ligne d'un texte et d'en récupérer le nombre.
Regardes la commande cat --help dans un terminal

Valaquarus
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#3 Posté le 10/1/2023 à 23:23:51
Foromus,
Il te suffit simplement de compter le nombre de fois le caractère 'retour chariot' et tu auras le nombre de ligne

Voici le code pour réaliser cela :

1
2
3
FOR i= 1 TO Len(Tachaine)
IF Mid$(tachaine,i,1)=caractererecherche THEN c=c+1
NEXT


Tachaine est la textarea,
Caratererecherche est chr(10)
Et 'c' est le résultat.
Bon codage !!
;)

spheris#4 Posté le 10/1/2023 à 23:33:32
..et une solution encore plus élegante de reivillo:

http://89.234.156.109/sujet-4500-recuperer-le-texte-dune-textarea-page-1.html#m5

Il te suffit de découper le texte à l'aide de la commande split pour compter le nombre de cases dans ta liste ainsi crée.
Foromus#5 Posté le 11/1/2023 à 07:56:25
Bonjour à tous,

Soit, j'ai bien compris qu'il suffit de compter les retours chariots.
Dans le code de valaquarus, je note :
" cat " qui concatène les chaines, donc, ce serait les lignes successives de mon fichiers,
" | wc -l " qui me donne les retours chariots dans le paquet.
Entre-deux, (& FMain.historic &), j'ai un peu de mal à suivre...
En fait, ce que je n'apréhende pas d'emblée, c'est comment je "récupère" les lignes de mon fichier ?
C'est un peu bête quand même, j'ai appris comment créer un fichier (for create), comment le lire (for read), voire rajouter des lignes (for append), et là je me pose la question : Comment ça se passe quand j'ai rajouté des lignes ? Parce que, jusqu'à présent, j'ai toujours exploité des fichiers qui avaient autant de lignes à la création qu'à la lecture (ex : 10 variables bien déterminées) et dans la lecture, j'avais le même compte de lignes que dans la création, dès lors que j'en rajoute, ce n'est plus le cas.
Au fond, mon vrai problème, c'est comment je fais pour lire un fichier.txt dont je ne connais pas, à l'avance, le nombre exact de lignes ?
D'où ma demande ici exprimée...
En attendant, je vais faire quelques essais avec le code de valaquarus, à part le centre que je ne comprends pas vraiment, le reste me semble cohérent.
valaquarus#6 Posté le 11/1/2023 à 08:35:10
-- Unus Ex Altera --Bonjour Foromus,
FMain.historic est simplement le nom du fichier dont tu veux compter les lignes.
lNbrLigne = Val(ceTexte) récupère le nombre de lignes dans une variable string ceTexte que tu transformes en valeur pour un calcul éventuel.

Valaquarus
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#7 Posté le 11/1/2023 à 09:30:09
Foromus,
Valaquarus a bien répondu à ta question.
Pour ma part j'ai grillé des étapes dans ma réponse.
Tu demandais de compter les lignes dans un fichier.
Il te propose de faire appel à une commande 'cat', externe à gambas sous toutes plates forme linux.
Cette commande te renvoi un nombre (sous la forme string)

Pour la solution que je te proposais, il faut d'abord ouvrir le fichier texte par la commande :

1
2
DIM montexte AS STRING
Montexte=File.open(monfichier.txt)


Et lâ tu peux traiter ta variable montexte pour en extraire le nombre de ligne comme ceci:
1
2
3
DIM maliste AS NEW string[]
maliste = Split(montexte,"\n")
PRINT maliste.count


C'est plus long car il faut d'abord ouvrir le fichier
Par contre, c'est du code gambas pur.
Dans tous les cas le résultat est le même.
;)
spheris#8 Posté le 11/1/2023 à 11:04:46
Valaquarus,
C'est bizarre,
Je ne trouve rien dans la doc à propos de la commande, méthode ou propriéte 'historic'.
Où l'as-tu trouvé?


Edit: je viens de comprendre. Fmain.historic est le nom de ton fichier texte.

Foromus,
Bousculons les habitudes, en gambas tu peux enregistrer un fichier texte par la simple commande :
1
File.save(monfichier.txt, le texte)


Ou bien ouvrir un fichier par la commande:

1
2
3
DIM montexte AS STRING

Montexte=File.open(monfichier.txt)
Foromus#9 Posté le 11/1/2023 à 12:06:24
RE,

Fmain.historic est le nom de ton fichier texte.
Ce à quoi j'avais pensé, mais pas tenté, me tournant vers le code de spheris : Merci spheris.
Malheureusement, ça ne colle pas. A la première ligne :
1
Montexte = File.open(monfichier.txt)

ça part direct en erreur chez catch....
Comme je suppose que le fichier doit être nanti de son chemin, j'ai écrit :
1
Montexte = File.open(Application.Path & "/Unrepertoire/monfichier.txt").

Je vais tenter le code de valaquarus, mais je pense quand même que, avant, il me faut ouvrir le fichier ! Et avec
1
Montexte = File.open(monfichier.txt)

ça semble compromis...
Edit :
En fait, non, mais je crois quand même qu'il faut bien mettre le chemin complet du fichier à la place de FMain.historic
valaquarus#10 Posté le 11/1/2023 à 13:09:25
-- Unus Ex Altera --Oui, il faut ouvrir le fichier avant de pouvoir l'utiliser :
1
2
3
4
5
6
7
8
9
PUBLIC historic AS STRING 'nom du fichier historque
PUBLIC histo AS File 'fichier historique

Fmain.historic = User.Home &/ ".clamscangui/Historique" 'Définition du fichier historique
IF NOT Exist(FMain.historic) THEN
FMain.histo = OPEN FMain.historic FOR CREATE
ELSE
FMain.histo = OPEN FMain.historic FOR INPUT
ENDIF
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
Foromus#11 Posté le 11/1/2023 à 15:02:07
En fait, ça coince toujours au même endroit : ouverture du fichier.

1
FMain.histo = OPEN FMain.historic FOR INPUT

ça ne passe pas...
valaquarus#12 Posté le 11/1/2023 à 15:09:05
-- Unus Ex Altera --Pour l'ouvrir le fichier et son nom doivent être déclarés :
1
2
PUBLIC historic AS STRING 'nom du fichier historique
PUBLIC histo AS File 'fichier historique

c'est le sens des deux premières lignes
1
2
3
4
5
6
7
8
historic = User.Home &/ "monFichierAMoi" 'Définition du nom historic
(en fait le chemin qui te va bien bien sûr)

IF NOT Exist(historic) THEN
histo = OPEN historic FOR CREATE
ELSE
histo = OPEN historic FOR INPUT
ENDIF

On peut directement écrire sans définir le string historic :
1
2
3
4
5
IF NOT Exist(User.Home &/ "monFichierAMoi") THEN
histo = OPEN User.Home &/ "monFichierAMoi" FOR CREATE
ELSE
histo = OPEN User.Home &/ "monFichierAMoi" FOR INPUT
ENDIF

Où FMain.histo fait référence à un fichier du formulaire FMain.
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
Foromus#13 Posté le 12/1/2023 à 11:58:51
 Bonjour à tous,

Merci pour tous ces renseignements.
Je vais laisser de côté pour l'instant, je verrai cela plus tard, mon projet n'ayant pas vraiment besoin de cette partie (simple indication), je vais m'en passer.
J'ai bien respecté le code, même si je ne comprends pas tout, mais ça ne colle pas.
Pourquoi ramener FMain dans l'affaire, mon fichier considéré n'est, ni dans le /home, ni dans le répertoire de l'application, ni dans l'application elle-même.
Quand je lance :
1
MonFichier = OPEN Application.Path & "/a/b/fichier.txt" FOR INPUT

C'est refusé, je ne peux donc plus aller plus loin.
(Il est vrai que je n'ai pas tout mis en majuscules, une erreur peut-être).
Pas grave, mais si un jour besoin il y a, je ne pense pas pouvoir ouvrir, par le code, un fichier complété par "Append", si je veux voir ce qu'il y a dedans, je dois passer par l'explorateur de xubu !
Merci encore.
valaquarus#14 Posté le 12/1/2023 à 20:16:34
-- Unus Ex Altera --comment est déclaré MonFichier ?
Si Monfichier est déclaré comme File ça doit marcher si le fichier est déjà existant et rempli ;
si NMonFichier est déclaré comme String ça ne marche pas car ce n'est pas un fichier mais un simple chemin (path)
Philippe
Système d'exploitation : KDE neon 6.0 ~ Version Gambas : 3.19.3
spheris#15 Posté le 12/1/2023 à 21:27:31
Foromus,
Ouvre ton explorateur de fichier et met toi dans le répertoire où se situe ton fichier texte.
Fais un clic droit entre deux icones et dans le menu popup ainsi ouvert clique sur executer un terminal ici.
Dans le terminal une fois ouvert ecris cette commande :

ls

Peux-tu copier le résultat de cette commande sur le forum s'il te plait?

Remarque : Je te demande cela car il semble que le chemin saisi dans gambas ne soit pas le bon : Attention !!! linux est sensible à la casse majuscule minuscule des lettre tout comme gambas poru un chemin de fichier.
12