Page 1 sur 1
Compter le nombre de ligne contenants x valeurs
Publié : lun. 13/nov./2006 14:48
par Ganagyre
Bonjour .
Comment compter le nombre de lignes comprenants
X valeurs numerique sur chaque ligne, dans un fichier texte
fichier situé en "c:\test.txt"
1;2;10;11
15;18;19;20
1;2;17;23
5;9;10;22
8;9;12;20
6;12;21;23
6;9;19;20
2;5;16;17
1;10;16;18
13;14;21;24
2;14;21;24
1;5;8;12
1;2;7;18
On cherche le nombre de lignes comportant à la fois les valeurs 1 et 2 :
se serait ci dessus les lignes 1 , 3 et 13 .
Soit 3 lignes au total.
Merci de toute astuce
Publié : lun. 13/nov./2006 15:32
par brossden
Voilà :
Code : Tout sélectionner
OpenFile(1,"c:\test.txt")
While Eof(1)=0
ligne+1
text.s =";"+ ReadString(1)+";"
If FindString(text,";1;",1)>0 And FindString(text,";2;",1)>0
compteur+1
lignes.s+Str(ligne)+" "
EndIf
Wend
MessageRequester("Ligne comportants 1 et 2", "Les lignes : "+ lignes + "Comportent 1 et 2 soit :"+Str(ligne))
CloseFile(1)
L'astuce réside à ajouter ";" avant et après chaque ligne pour que tous les nombres soient bordés de ce même caractère ";" ici !
Ensuite il suffit de vérifier pour chaque ligne que ";1;" et ";2;" soient présent pout incrémenter un compteur !
Publié : lun. 13/nov./2006 17:20
par Flype
bonjour ganagyre,
allez, une autre méthode ?
celle ci est differente de celle de brossden - 2 méthodes ca mange pas de pain :
Code : Tout sélectionner
Procedure.l AnalyserFichier(fichier.s)
Protected ligne.s, condition1.l, condition2.l, compteur.l
If OpenFile(1, fichier)
While Not Eof(1)
condition1 = #False
condition2 = #False
ligne = ReadString(1)
For colonne = 1 To 4
If StringField(ligne, colonne, ";") = "1" : condition1 = #True : EndIf
If StringField(ligne, colonne, ";") = "2" : condition2 = #True : EndIf
Next
If condition1 And condition2
compteur + 1
EndIf
Wend
CloseFile(1)
EndIf
ProcedureReturn compteur
EndProcedure
Debug AnalyserFichier("c:\test.txt")
Publié : lun. 13/nov./2006 20:25
par brossden
La méthode de base de bonnées oui, mais attention si le nombre de valeur vient à changer sur une ou plusieurs lignes. Dans ce cas toutes les valeurs ne seront pas scrutées !
Publié : lun. 13/nov./2006 21:40
par Flype
sauf si tu changes le For i=1 to 4 par ce que tu veux - ca reste super flexible.
faut juste connaitre le nombre maximum de colonnes c'est tout. ca me semble etre la moindre des choses quand on manipule des données.
Publié : mar. 14/nov./2006 0:46
par Guimauve
Légère modif au code de Flype. Le nombre de colonne se réajuste un fonction de la ligne en cours de lecture-d'analyse.
A+
Guimauve
Code : Tout sélectionner
Procedure.l AnalyserFichier(fichier.s)
Protected ligne.s, condition1.l, condition2.l, compteur.l
If OpenFile(1, fichier)
While Not Eof(1)
condition1 = #False
condition2 = #False
ligne = ReadString(1)
For colonne = 1 To CountString(ligne, ";")
If StringField(ligne, colonne, ";") = "1" : condition1 = #True : EndIf
If StringField(ligne, colonne, ";") = "2" : condition2 = #True : EndIf
Next
If condition1 And condition2
compteur + 1
EndIf
Wend
CloseFile(1)
EndIf
ProcedureReturn compteur
EndProcedure
Publié : mar. 14/nov./2006 15:32
par Ganagyre
Bonjour.
Merci à tous pour vos exemples de code

.
brossden
Flype
Guimauve
Une petite modif au code de brossden, c'est le premier que j'ai repris et que j'etudie .
OpenFile(1,"c:\test1.txt")
While Eof(1)=0
ligne+1
text.s =";"+ ReadString(1)+";"
If FindString(text,";1;",1)>0 And FindString(text,";2;",1)>0
compteur+1
lignes.s+Str(ligne)+" "
EndIf
Wend
MessageRequester("Ligne comportants 1 et 2", "Les lignes : "+ lignes + "Comportent 1 et 2 soit : "+Str(compteur))
CloseFile(1)
=-=-=-=-=-=-=-=
la modif en affichage = "+Str(compteur))
à la place de :"+Str(ligne))
Pour avoir le nombre de lignes trouvées.
Pour fignoler ce petit exercice de comptage , il me restera à ecrire le resultat de la recherche dans un fichier resutat.txt.
1;2;3
pour valeur 1 et valeur 2 trouvées 3 fois, dans cet exemple.
@ +
Publié : mar. 14/nov./2006 19:40
par brossden
Il y avait un petit bug ! Le soft n'affichait pas le nombre total de ligne ! C'est corrigé et avec l'écriture du résultat dans un fichier ...
Code : Tout sélectionner
OpenFile(1,"c:\test.txt")
While Eof(1)=0
ligne+1
text.s =";"+ ReadString(1)+";"
If FindString(text,";1;",1)>0 And FindString(text,";2;",1)>0
compteur+1
lignes.s+Str(ligne)+" "
EndIf
Wend
MessageRequester("Ligne comportants 1 et 2", "Les lignes : "+ lignes + " Comportent 1 et 2 soit : "+Str(compteur) +" lignes")
CloseFile(1)
OpenFile(1,"c:\resultat.txt")
WriteString(1,Str(compteur))
CloseFile(1)
Publié : mar. 21/nov./2006 8:13
par Ganagyre
Bonjour.
Un peu de retard !
Grand merci à tous .
@ +
Comptage Episode 2
Publié : ven. 01/déc./2006 12:34
par Ganagyre
Bonjour .
Apres tripatouillage, je bloque sur de "petits details " :
Code : Tout sélectionner
OpenFile(1,"c:\test.txt")
num1=1
num2=2
For toto = 2 To 5
num2 = toto
While Eof(1)=0
ligne+1
text.s =";"+ ReadString(1)+";"
;----------------------------
If FindString(text,";"+Str(num1)+";",1)>0
qte1 = 1
EndIf
If FindString(text,";"+Str(num2)+";",1)>0
qte2 = 1
EndIf
;----------------------------
total = qte1 + qte2
;----------------------------
Select total
Case 2
compteur2+1
lignes.s+Str(ligne)+" "
EndSelect
;----------------------------
qte1 =0 : qte2 =0
total = 0
Wend
MessageRequester("Ligne comportants"+Str(num1)+" & " +Str(num2),"Valeurs "+Str(num1)+" & "+Str(num2)+" Trouvés = "+Str(compteur2)+" Lignes = "+lignes)
Next toto
CloseFile(1)
OpenFile(1,"c:\resultat.txt")
WriteString(1,(Str(num1)+";"+Str(num2)+"; Trouvés = "+Str(compteur2)+" lignes = "+lignes))
CloseFile(1)
Au debut j'ai testé en changeant Manuellement les valeurs des variables "Num1" & "num2", la aucun bleme , le calcul est bien different à chaque fois.
En ajoutant une boucle For Next , le resultat ne change pas !
(pourquoi ? remettre toutes les variables à zero ? )
En mettant une boucle on obtient normalement autants de lignes de resultats à ecrire dans le fichier resultat .txt. Comment faire la aussi ?
Voila , merci de toute aide

.
Publié : mar. 05/déc./2006 8:48
par Ganagyre
Bonjour.
Hum apparement c'est au niveau de la boucle
While Eof(1)=0
...
...
...
Wend
Une fois parcouru elle reste sur la fin

meme si elle se trouve dans une autre boucle style For / Next .
Comment repartir du debut
@ +