Compter le nombre de ligne contenants x valeurs

Vous débutez et vous avez besoin d'aide ? N'hésitez pas à poser vos questions
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Compter le nombre de ligne contenants x valeurs

Message 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
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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 !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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")
Image
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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 !
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Flype
Messages : 2431
Inscription : jeu. 29/janv./2004 0:26
Localisation : Nantes

Message 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.
Image
Guimauve
Messages : 1015
Inscription : mer. 11/févr./2004 0:32
Localisation : Québec, Canada

Message 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
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Bonjour.


Merci à tous pour vos exemples de code :wink: .

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.


@ +
brossden
Messages : 833
Inscription : lun. 26/janv./2004 14:37

Message 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)
Denis

Bonne Jounée à tous
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message par Ganagyre »

Bonjour.

Un peu de retard !


Grand merci à tous .

@ +
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Comptage Episode 2

Message 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 :wink: .
Avatar de l’utilisateur
Ganagyre
Messages : 67
Inscription : jeu. 09/nov./2006 13:41
Localisation : PACA

Message 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 :?:


@ +
Répondre