Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

trie et affichage d'un fichier

27 réponses
Avatar
Rosalie Mignon
Bonjour

Je dois filtrer un fichier .TXT (5Mo environ), pour n'afficher que les
lignes contenant des informations utiles soit une dizaine de lignes.
De plus, je prevois une zone de saisie ou l'utiisateur pourra indiquer les
informations qu'il souhaite voire afficher et donc je devrais mettre a jour
l'affichage en consequence.

Pensez-vous que je doive afficher ces lignes dans une List, un textbox ou un
richbox sachant que je n'ai pas de mise en forme particuliere a faire.

Merci d'avance.

10 réponses

1 2 3
Avatar
Rosalie Mignon
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.


Encore merci pour vos
"Jean-marc" a écrit dans le message de news:
4b83715f$0$2855$
Rosalie Mignon wrote:
Bonjour



Bonjour,

Je vais donc m'orienter vers le Textbox.
En fait, j'ai deux fichiers de 5 Mo environ a traiter en meme temps.
Pour chacun des fichiers, je dois realiser un affichage simultane a
l'ecran suivant un filtre predetermine



OK.

puis, suivant la saisie eventuelle de l'utilisateur, refiltrer a
nouveau ces fichiers a la recherche des nouvelles infos
et les afficher.



OK

Sauriez vous m'indiquer un moyen plus rapide que le classique mais
efficace Pour un fichier
lire la ligne (line input)
recherche des occurrences (instr)
affichage de la ligne eventuel (gestion de la textbox)
Fichier suivant



Il y a effectivement un moyen plus "rapide". Ce moyen est décrit ici
dans cet article de la FAQ:
http://faq.vb.free.fr/index.php?question5

Le principe est de tout lire dans un buffer puis d'utiliser Split()
pour faire un tableau de lignes. On parcourt ensuie ce tableau
et on filtre avec Instr().

Le gain en temps devrait déjà être substantiel.

Pour des fichiers de l'ordre de 5 Mo, cette méthode est applicable et
tout à fait suffisante.

Pour de plus gros fichiers ou pour gagner encore en vitesse et en fluidité
(partage du boulot entre le controlleur de disque et le processeur), il
existe
encore d'autres techniques, un peu plus compliquées à mettre en oeuvre.
Sans doute pas nécessaire ici.


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
Jean-marc
LE TROLL wrote:
Cher Jean-Marc,

Oui chef, tu dois parler de split, d'une lecture RAM, moi je te



Non : Je parlais d'accès disque:
f = freefile
while not eof(f)
line input #f, s
wend


parle d'une lecture séquentielle sur disque avec plusieurs tests (une
dizaine par ligne) afin de chercher les rimes, puis chargement en
liste, ce qui explique le temps.



OK. Ce sont tes "tests" qui prennent du temps, pas les accès disque.

Il est certain qu'en RAM ça va plus vite, puisque sur disque nous
sommes à 7 ms environ,



Beaucoup moins que ça, heureusement !!

toutefois et pour l'exemple, j'ai un vieux
notebook PC de 400 Mo de RAM avec XPsp2Pro;



Ok, mais c'est hors-jeu ; On ne benche pas une appli sur un matériel qui
a 15 ans de retard alors que la puissance moyenne des machines double
tous les 18 mois (cf. http://fr.wikipedia.org/wiki/Loi_de_Moore)

ben je peux te dire que
si tu lui réquisition 50 mo sur ses 400, il risque de ne pas aimer,



Certes. Mais dans le cas qui nous occupe, nous parlions de 5 Mo, pas de
50. Et c'est de toute façon hors sujet puisque je parlais bien de
lecture sur disque.

Si à l'origine des fichiers on a fait des constructions à deux
fichier pour indexer les datas, voire trois fichiers afin de faire un
multicritère (qui devient de facto quasiment un BDD), c'est peut être
qu'il y avait une raison,



Bien sur. Je ne nie aucunement les bienfaits des fichiers séquentiels
indexés, au contraire.

la raison est celle que si tu mets en RAM
comme tu veux le faire, 500 Mo,



Non. Pas 500 Mo : 5 Mo. C'est complètement différent.

et que tous tes programmes sont
ainsi, si jamais plusieurs tournent en même temps, tu risques de te
retrouver en pseudo-mémoire sur disque (qui naguère faisait un
dépassement de capacité de la RAM).



Même pas vrai sur une machine raisonnablement moderne, équipée en
standard de 4 à 8 Go de Ram.

Je crois que comme je dis "il faut voir", l'indexé et le
multicritères est une excellente solution avec des datas fixes,



Oui et non. L'indexé était une bonne solution, peut encore l'être
dans des cas extrèmes mais dans le cas général, n'importe quel
SGBD est infiniment plus souple et simple à mettre en oeuvre.

car au pointeur ça va quand même vite sur le disque,



C'était vrai dans les années 80/90. Plus aujourd'hui ou les controleurs
de disque sont plus puissants qu'un 486 d'il y a 15 ans et le hardware
infiniment plus fiable et rapide.

toutefois, comme tu
le remarques, c'est davantage pour les fichiers qu'on a pas trop
souvent à réindexer, voire jamais, sinon on perd le bénéfice de la
structure.



Exact.

Et la mémoire, c'est en fonction des sa taille et des
programme qui y accèdent, ou alors on fait le fichier en RAM par
morceaux.



Arf, le bon temps des overlays. Tout cela était vrai (et l'est encore)
pour de grandes tailles de fichiers (plusieurs Go).

Pour l'anecdote, quand j'étais sous Prologue-Bull France en OS
BAL, il y avait des truc merveilleux, que Microsoft n'a même pas
pompé, s'ajustant simplement au CPM (8.3), en effet :



<snip>
C'est vrai. Et ce dont tu parles existe encore sur pas mal de gros
systèmes, pour la compatibilité.

Et bien, tout ça pour dire que c'est dommage que ce ne soit pas aussi
simple, c'était, c'est Français, mais on ne sait pas vendre, alors MS
a réussi lui, à vendre un système de gestion des fichiers quatre fois
moins performant, lamentable !



Pas moins performant, différent et surtout fait pour un autre usage.
Et puis tu parles d'OS ici. Sache que le Microsoft COBOL te permet
toujours de faire "en direct" du séquentiel indexé.

Pour ma part, in fine, je dirais que le choix doit s'opérer en
fonction des critères sus-cités, et non pas être systématique.



Bien sur, mais un bon choix se prend en fonction de bonnes connaissances.
Tu feras un mauvais choix si tu penses que le hardware de 2010 est le
même que celui des années 90.

Je rends désormais ma copie au chef,



[J'aime bien quand tu m'appelles 'le chef' :o) ]

qui va se faire une joie de l'annoter.



Et voila :-)

Cordialement ;o)



Pareil :o)


--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
Rosalie Mignon wrote:
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.



Pour info, j'ai fait un petit test:

J'ai généré un fichier test de 6 Mo, contenant 50000 lignes
de plus ou moins 100 caractères. Parmi ces lignes, une centaine
contiennent un certain pattern que je veux rechercher.

J'ai réalisé ensuite 2 fonctions, faisant la même chose, à savoir:
- lecture du fichier
- examen des lignes à la recherche du pattern à trouver
- quand pattern trouvé, ajout à une textBox multiligne

La différence entre les 2 fonctions est que :
- la première fait une lecture basique, ligne à ligne
- la seconde fait une lecture d'un bloc et traite le
tout en mémoire.

La première fonction fait le travail en 320 milisecondes
La seconde fonction ne prend que 270 milisecondes

Dans les 2 cas, les performances sont excellentes puisque
finalement, le tout prend moins d'un tiers de seconde :
c'est presque invisible pour l'oeil.

Le traitement en parallèle de 2 fichiers va donc prendre
2 fois plus de temps, soit plus ou moins 500 à 600 milisecondes.

On reste bien inférieur à une seconde, ce qui est fort acceptable
pour ce genre de programme : l'utilisateur n'a même pas le temps
de penser à se lever pour aller prendre un café!

Pour info, voici mon prgramme de test.

Il faut 3 boutons de commandes :

Command1 est utilisé pour générer le fichier de test
Command2 applique le filtre à la mode "lecture Line Input"
Command3 applique le filtre à la mode "lecture en mémoire"

Et un TextBox (text1), propriété "Multiline" = True

Voici :

' 8<-----------------------------------

Option Explicit

Private Declare Function QueryPerformanceCounter _
Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency _
Lib "Kernel32" (X As Currency) As Boolean

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim r As Long
Dim i As Long

f = FreeFile
Open "c:test.dat" For Output As #f
For i = 1 To 50000
r = Int(Rnd * 1000) + 1
If r = 998 Then
s = "XXXX HELLO WORLD XXX"
ElseIf r = 999 Then
s = "XXXX COUCOU LES AMIS XXX"
Else
s = String(Rnd * 50 + 100, _
Chr$(65 + Rnd * 26))
End If
Print #f, s
Next i
Close #f

End Sub

Private Sub Command2_Click()
Dim f As Integer
Dim pattern As String
Dim n As Long
Dim s As String
Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Input As #f
While Not EOF(f)
n = n + 1
Line Input #f, s
If InStr(s, pattern) > 0 Then
Text1.Text = Text1.Text & n _
& vbTab & s & vbCrLf
End If
Wend
Close #f
Text1.Enabled = True
QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub



Private Sub Command3_Click()
Dim f As Integer
Dim pattern As String
Dim buffer As String
Dim t() As String
Dim i As Long

Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Binary As #f
buffer = Space$(LOF(f))
Get #f, , buffer
Close #f

t() = Split(buffer, vbCrLf)
For i = LBound(t()) To UBound(t())
If InStr(t(i), pattern) > 0 Then
Text1.Text = Text1.Text & i & _
vbTab & t(i) & vbCrLf
End If
Next i

Text1.Enabled = True

QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub


' 8<----------------------------------------
Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Rosalie Mignon
Bonjour

Effectivement j'ai pu le constater en m'inspirant de vos exemples.
Par contre, si on imaginait que les lignes filtrees seraient plus nombreuses
que prevues (non plus une dizaine mais inconnues)
et depassent la capacite du Textbox, je serai donc oblige de passer sur un
Richbox, n'est ce pas ?
Je cree donc un fichier resultat pour pouvoir utiliser Richbox.loadfile,
exact ?



"Jean-marc" a écrit dans le message de news:
4b84414e$0$2864$
Rosalie Mignon wrote:
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.



Pour info, j'ai fait un petit test:

J'ai généré un fichier test de 6 Mo, contenant 50000 lignes
de plus ou moins 100 caractères. Parmi ces lignes, une centaine
contiennent un certain pattern que je veux rechercher.

J'ai réalisé ensuite 2 fonctions, faisant la même chose, à savoir:
- lecture du fichier
- examen des lignes à la recherche du pattern à trouver
- quand pattern trouvé, ajout à une textBox multiligne

La différence entre les 2 fonctions est que :
- la première fait une lecture basique, ligne à ligne
- la seconde fait une lecture d'un bloc et traite le
tout en mémoire.

La première fonction fait le travail en 320 milisecondes
La seconde fonction ne prend que 270 milisecondes

Dans les 2 cas, les performances sont excellentes puisque
finalement, le tout prend moins d'un tiers de seconde :
c'est presque invisible pour l'oeil.

Le traitement en parallèle de 2 fichiers va donc prendre
2 fois plus de temps, soit plus ou moins 500 à 600 milisecondes.

On reste bien inférieur à une seconde, ce qui est fort acceptable
pour ce genre de programme : l'utilisateur n'a même pas le temps
de penser à se lever pour aller prendre un café!

Pour info, voici mon prgramme de test.

Il faut 3 boutons de commandes :

Command1 est utilisé pour générer le fichier de test
Command2 applique le filtre à la mode "lecture Line Input"
Command3 applique le filtre à la mode "lecture en mémoire"

Et un TextBox (text1), propriété "Multiline" = True

Voici :

' 8<-----------------------------------

Option Explicit

Private Declare Function QueryPerformanceCounter _
Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency _
Lib "Kernel32" (X As Currency) As Boolean

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim r As Long
Dim i As Long

f = FreeFile
Open "c:test.dat" For Output As #f
For i = 1 To 50000
r = Int(Rnd * 1000) + 1
If r = 998 Then
s = "XXXX HELLO WORLD XXX"
ElseIf r = 999 Then
s = "XXXX COUCOU LES AMIS XXX"
Else
s = String(Rnd * 50 + 100, _
Chr$(65 + Rnd * 26))
End If
Print #f, s
Next i
Close #f

End Sub

Private Sub Command2_Click()
Dim f As Integer
Dim pattern As String
Dim n As Long
Dim s As String
Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Input As #f
While Not EOF(f)
n = n + 1
Line Input #f, s
If InStr(s, pattern) > 0 Then
Text1.Text = Text1.Text & n _
& vbTab & s & vbCrLf
End If
Wend
Close #f
Text1.Enabled = True
QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub



Private Sub Command3_Click()
Dim f As Integer
Dim pattern As String
Dim buffer As String
Dim t() As String
Dim i As Long

Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Binary As #f
buffer = Space$(LOF(f))
Get #f, , buffer
Close #f

t() = Split(buffer, vbCrLf)
For i = LBound(t()) To UBound(t())
If InStr(t(i), pattern) > 0 Then
Text1.Text = Text1.Text & i & _
vbTab & t(i) & vbCrLf
End If
Next i

Text1.Enabled = True

QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub


' 8<----------------------------------------
Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;






Avatar
LE TROLL
LOL qu'ils disent :o)

Cordialement

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Rosalie Mignon" a écrit dans le message de
news:4b84c408$0$22038$
Bonjour

Effectivement j'ai pu le constater en m'inspirant de vos exemples.
Par contre, si on imaginait que les lignes filtrees seraient plus
nombreuses que prevues (non plus une dizaine mais inconnues)
et depassent la capacite du Textbox, je serai donc oblige de passer sur un
Richbox, n'est ce pas ?
Je cree donc un fichier resultat pour pouvoir utiliser Richbox.loadfile,
exact ?



"Jean-marc" a écrit dans le message de news:
4b84414e$0$2864$
Rosalie Mignon wrote:
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.



Pour info, j'ai fait un petit test:

J'ai généré un fichier test de 6 Mo, contenant 50000 lignes
de plus ou moins 100 caractères. Parmi ces lignes, une centaine
contiennent un certain pattern que je veux rechercher.

J'ai réalisé ensuite 2 fonctions, faisant la même chose, à savoir:
- lecture du fichier
- examen des lignes à la recherche du pattern à trouver
- quand pattern trouvé, ajout à une textBox multiligne

La différence entre les 2 fonctions est que :
- la première fait une lecture basique, ligne à ligne
- la seconde fait une lecture d'un bloc et traite le
tout en mémoire.

La première fonction fait le travail en 320 milisecondes
La seconde fonction ne prend que 270 milisecondes

Dans les 2 cas, les performances sont excellentes puisque
finalement, le tout prend moins d'un tiers de seconde :
c'est presque invisible pour l'oeil.

Le traitement en parallèle de 2 fichiers va donc prendre
2 fois plus de temps, soit plus ou moins 500 à 600 milisecondes.

On reste bien inférieur à une seconde, ce qui est fort acceptable
pour ce genre de programme : l'utilisateur n'a même pas le temps
de penser à se lever pour aller prendre un café!

Pour info, voici mon prgramme de test.

Il faut 3 boutons de commandes :

Command1 est utilisé pour générer le fichier de test
Command2 applique le filtre à la mode "lecture Line Input"
Command3 applique le filtre à la mode "lecture en mémoire"

Et un TextBox (text1), propriété "Multiline" = True

Voici :

' 8<-----------------------------------

Option Explicit

Private Declare Function QueryPerformanceCounter _
Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency _
Lib "Kernel32" (X As Currency) As Boolean

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim r As Long
Dim i As Long

f = FreeFile
Open "c:test.dat" For Output As #f
For i = 1 To 50000
r = Int(Rnd * 1000) + 1
If r = 998 Then
s = "XXXX HELLO WORLD XXX"
ElseIf r = 999 Then
s = "XXXX COUCOU LES AMIS XXX"
Else
s = String(Rnd * 50 + 100, _
Chr$(65 + Rnd * 26))
End If
Print #f, s
Next i
Close #f

End Sub

Private Sub Command2_Click()
Dim f As Integer
Dim pattern As String
Dim n As Long
Dim s As String
Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Input As #f
While Not EOF(f)
n = n + 1
Line Input #f, s
If InStr(s, pattern) > 0 Then
Text1.Text = Text1.Text & n _
& vbTab & s & vbCrLf
End If
Wend
Close #f
Text1.Enabled = True
QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub



Private Sub Command3_Click()
Dim f As Integer
Dim pattern As String
Dim buffer As String
Dim t() As String
Dim i As Long

Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Binary As #f
buffer = Space$(LOF(f))
Get #f, , buffer
Close #f

t() = Split(buffer, vbCrLf)
For i = LBound(t()) To UBound(t())
If InStr(t(i), pattern) > 0 Then
Text1.Text = Text1.Text & i & _
vbTab & t(i) & vbCrLf
End If
Next i

Text1.Enabled = True

QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub


' 8<----------------------------------------
Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;










Avatar
Rosalie Mignon
Bonjour

J'avoue que je n'ai pas bien compris votre reponse.
Pourriez vous etre plus clair.

Merci d'avance.

"LE TROLL" <le a écrit dans le message de news:

LOL qu'ils disent :o)

Cordialement

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Rosalie Mignon" a écrit dans le message de
news:4b84c408$0$22038$
Bonjour

Effectivement j'ai pu le constater en m'inspirant de vos exemples.
Par contre, si on imaginait que les lignes filtrees seraient plus
nombreuses que prevues (non plus une dizaine mais inconnues)
et depassent la capacite du Textbox, je serai donc oblige de passer sur
un Richbox, n'est ce pas ?
Je cree donc un fichier resultat pour pouvoir utiliser Richbox.loadfile,
exact ?



"Jean-marc" a écrit dans le message de news:
4b84414e$0$2864$
Rosalie Mignon wrote:
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.



Pour info, j'ai fait un petit test:

J'ai généré un fichier test de 6 Mo, contenant 50000 lignes
de plus ou moins 100 caractères. Parmi ces lignes, une centaine
contiennent un certain pattern que je veux rechercher.

J'ai réalisé ensuite 2 fonctions, faisant la même chose, à savoir:
- lecture du fichier
- examen des lignes à la recherche du pattern à trouver
- quand pattern trouvé, ajout à une textBox multiligne

La différence entre les 2 fonctions est que :
- la première fait une lecture basique, ligne à ligne
- la seconde fait une lecture d'un bloc et traite le
tout en mémoire.

La première fonction fait le travail en 320 milisecondes
La seconde fonction ne prend que 270 milisecondes

Dans les 2 cas, les performances sont excellentes puisque
finalement, le tout prend moins d'un tiers de seconde :
c'est presque invisible pour l'oeil.

Le traitement en parallèle de 2 fichiers va donc prendre
2 fois plus de temps, soit plus ou moins 500 à 600 milisecondes.

On reste bien inférieur à une seconde, ce qui est fort acceptable
pour ce genre de programme : l'utilisateur n'a même pas le temps
de penser à se lever pour aller prendre un café!

Pour info, voici mon prgramme de test.

Il faut 3 boutons de commandes :

Command1 est utilisé pour générer le fichier de test
Command2 applique le filtre à la mode "lecture Line Input"
Command3 applique le filtre à la mode "lecture en mémoire"

Et un TextBox (text1), propriété "Multiline" = True

Voici :

' 8<-----------------------------------

Option Explicit

Private Declare Function QueryPerformanceCounter _
Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency _
Lib "Kernel32" (X As Currency) As Boolean

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim r As Long
Dim i As Long

f = FreeFile
Open "c:test.dat" For Output As #f
For i = 1 To 50000
r = Int(Rnd * 1000) + 1
If r = 998 Then
s = "XXXX HELLO WORLD XXX"
ElseIf r = 999 Then
s = "XXXX COUCOU LES AMIS XXX"
Else
s = String(Rnd * 50 + 100, _
Chr$(65 + Rnd * 26))
End If
Print #f, s
Next i
Close #f

End Sub

Private Sub Command2_Click()
Dim f As Integer
Dim pattern As String
Dim n As Long
Dim s As String
Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Input As #f
While Not EOF(f)
n = n + 1
Line Input #f, s
If InStr(s, pattern) > 0 Then
Text1.Text = Text1.Text & n _
& vbTab & s & vbCrLf
End If
Wend
Close #f
Text1.Enabled = True
QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub



Private Sub Command3_Click()
Dim f As Integer
Dim pattern As String
Dim buffer As String
Dim t() As String
Dim i As Long

Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Binary As #f
buffer = Space$(LOF(f))
Get #f, , buffer
Close #f

t() = Split(buffer, vbCrLf)
For i = LBound(t()) To UBound(t())
If InStr(t(i), pattern) > 0 Then
Text1.Text = Text1.Text & i & _
vbTab & t(i) & vbCrLf
End If
Next i

Text1.Enabled = True

QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub


' 8<----------------------------------------
Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;













Avatar
LE TROLL
Bonjour,

Ah ma réponse, c'est que j'étais amusé en lisant la discussion au fur
des messages... en fait on parle d'une chose dont on ne sait rien, je parle
du fichier, ni s'il est mis ou pas à jour, sa fréquence de mise à jour, le
nombre de tris par ligne, si les enregistrement sont formatés, s'il peut
être morcelé... tout ce qui permettrait de se faire une idée.

Pour t'en convaincre, notre ami "At" le 22/2/10 à 19h36 écrit :
"Tu dois bien avoir des critères qui te permettent d'orienter ton choix,
sinon pourquoi poser la question :)"

En fait, c'est la synthèse de ce que je pense aussi, si tu ne dis rien,
la question n'est guère productive et te ramène de facto au point de départ,
à savoir que ce n'est que toi qui peut choisir puisque tu ne donnes aucune
information permettant réellement de faire un choix.
Sur ceci, tu confirmes en répondant que tu vas prendre le texteBox le 23 à
6h23, surconfirmé à 6h43...

Puis... le 24 à 7h15, deux jours après tu changes d'avis toute seule,
estimant que tes quelques lignes de réponse au tri (à l'origine), pourraient
remplir un textBox... ah... en effet, quand tu dis "quelques lignes" ce
n'est pas rien...
Je te cite : "... une dizaine de lignes...". dans ton message d'origine.

En plus, nul n'a réellement parlé d'un RTF à part toi, car on l'utilise
assez rarement, et davantage pour avoir la couleur et la mise en forme
qu'autre chose, son format est très proche de celui d'un DOC, il faut mettre
en ouvre un tas d'éléments et faire des manipulations...

Bon, j'ai trouvé que ça devenait assez incongru, car si tu ne mets pas à
plat les possibilités et besoins, tu ne pourras jamais trouver de réponse
appropriée, de facto je ne comprends pas pourquoi tu ne commences pas par le
commencement, comme on dit.
Alors ça me fait rire du fait que tu sembles savoir que tu as un fichier
texte, mais tu sembles tout autant ne pas trop savoir ce que tu dois en
faire, alors si tu ne le sais pas il devient difficile de répondre, si ce
n'est pour le plaisir d'écrire et le sport...

Cordialement :o)

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Rosalie Mignon" a écrit dans le message de
news:4b853a71$0$21282$
Bonjour

J'avoue que je n'ai pas bien compris votre reponse.
Pourriez vous etre plus clair.

Merci d'avance.

"LE TROLL" <le a écrit dans le message de news:

LOL qu'ils disent :o)

Cordialement

-
Logiciels, romans, contacts : http://irolog.free.fr
_______________________
.
.


"Rosalie Mignon" a écrit dans le message de
news:4b84c408$0$22038$
Bonjour

Effectivement j'ai pu le constater en m'inspirant de vos exemples.
Par contre, si on imaginait que les lignes filtrees seraient plus
nombreuses que prevues (non plus une dizaine mais inconnues)
et depassent la capacite du Textbox, je serai donc oblige de passer sur
un Richbox, n'est ce pas ?
Je cree donc un fichier resultat pour pouvoir utiliser Richbox.loadfile,
exact ?



"Jean-marc" a écrit dans le message de news:
4b84414e$0$2864$
Rosalie Mignon wrote:
Bonjour

Merci beaucoup pour toutes vos explications.
Je vais essayer ce que vous preconisez.



Pour info, j'ai fait un petit test:

J'ai généré un fichier test de 6 Mo, contenant 50000 lignes
de plus ou moins 100 caractères. Parmi ces lignes, une centaine
contiennent un certain pattern que je veux rechercher.

J'ai réalisé ensuite 2 fonctions, faisant la même chose, à savoir:
- lecture du fichier
- examen des lignes à la recherche du pattern à trouver
- quand pattern trouvé, ajout à une textBox multiligne

La différence entre les 2 fonctions est que :
- la première fait une lecture basique, ligne à ligne
- la seconde fait une lecture d'un bloc et traite le
tout en mémoire.

La première fonction fait le travail en 320 milisecondes
La seconde fonction ne prend que 270 milisecondes

Dans les 2 cas, les performances sont excellentes puisque
finalement, le tout prend moins d'un tiers de seconde :
c'est presque invisible pour l'oeil.

Le traitement en parallèle de 2 fichiers va donc prendre
2 fois plus de temps, soit plus ou moins 500 à 600 milisecondes.

On reste bien inférieur à une seconde, ce qui est fort acceptable
pour ce genre de programme : l'utilisateur n'a même pas le temps
de penser à se lever pour aller prendre un café!

Pour info, voici mon prgramme de test.

Il faut 3 boutons de commandes :

Command1 est utilisé pour générer le fichier de test
Command2 applique le filtre à la mode "lecture Line Input"
Command3 applique le filtre à la mode "lecture en mémoire"

Et un TextBox (text1), propriété "Multiline" = True

Voici :

' 8<-----------------------------------

Option Explicit

Private Declare Function QueryPerformanceCounter _
Lib "Kernel32" (X As Currency) As Boolean
Private Declare Function QueryPerformanceFrequency _
Lib "Kernel32" (X As Currency) As Boolean

Private Sub Command1_Click()
Dim f As Integer
Dim s As String
Dim r As Long
Dim i As Long

f = FreeFile
Open "c:test.dat" For Output As #f
For i = 1 To 50000
r = Int(Rnd * 1000) + 1
If r = 998 Then
s = "XXXX HELLO WORLD XXX"
ElseIf r = 999 Then
s = "XXXX COUCOU LES AMIS XXX"
Else
s = String(Rnd * 50 + 100, _
Chr$(65 + Rnd * 26))
End If
Print #f, s
Next i
Close #f

End Sub

Private Sub Command2_Click()
Dim f As Integer
Dim pattern As String
Dim n As Long
Dim s As String
Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Input As #f
While Not EOF(f)
n = n + 1
Line Input #f, s
If InStr(s, pattern) > 0 Then
Text1.Text = Text1.Text & n _
& vbTab & s & vbCrLf
End If
Wend
Close #f
Text1.Enabled = True
QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub



Private Sub Command3_Click()
Dim f As Integer
Dim pattern As String
Dim buffer As String
Dim t() As String
Dim i As Long

Dim Ctr1 As Currency, Ctr2 As Currency
Dim Freq As Currency

pattern = "HELLO WORLD"

QueryPerformanceCounter Ctr1

Text1.Text = ""
Text1.Enabled = False

f = FreeFile
Open "c:test.dat" For Binary As #f
buffer = Space$(LOF(f))
Get #f, , buffer
Close #f

t() = Split(buffer, vbCrLf)
For i = LBound(t()) To UBound(t())
If InStr(t(i), pattern) > 0 Then
Text1.Text = Text1.Text & i & _
vbTab & t(i) & vbCrLf
End If
Next i

Text1.Enabled = True

QueryPerformanceCounter Ctr2
QueryPerformanceFrequency Freq

MsgBox "Temps écoulé : " & _
((Ctr2 - Ctr1) / Freq) * 1000 & " millisecondes"

End Sub


' 8<----------------------------------------
Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;

















Avatar
Jean-marc
Rosalie Mignon wrote:
Bonjour



Bonjour,

Effectivement j'ai pu le constater en m'inspirant de vos exemples.
Par contre, si on imaginait que les lignes filtrees seraient plus
nombreuses que prevues (non plus une dizaine mais inconnues)
et depassent la capacite du Textbox, je serai donc oblige de passer
sur un Richbox, n'est ce pas ?



Par exemple oui. Mais ça dépend de la taille du résultat.

Je cree donc un fichier resultat pour pouvoir utiliser
Richbox.loadfile, exact ?



Ca c'est de toute façon une excellente idée.

Comme ça tu peux toujours proposer à l'utilisateur un truc du genre:

"Attention : le résultat contient plus de XXXX lignes - Voulez vous
l'afficher (Oui/Non) (Note: le résultat est disponible dans le
fichier 'c:...result.dat')"

Remarque additionnelle : Dans la mesure ou les utilisateurs peuvent
appliquer des filtres supplémentaires, tu as vraiement intérêt à
utiliser la méthode de lecture dans un buffer que tu splites.
En effet, tu peux stocker le résultat du split() (le tableau t() dans
mon exemple) dans une variable globale, que tu pourras réutiliser pour
les requetes suivantes : tu gagnes du coup beaucoup de temps.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
Rosalie Mignon wrote:
Bonjour

J'avoue que je n'ai pas bien compris votre reponse.
Pourriez vous etre plus clair.



Aucune chance, hélas ...

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
LE TROLL wrote:
Bonjour,



Hello,

(je viens annoter un peu, c'est une marotte)

Ah ma réponse, c'est que j'étais amusé en lisant la discussion au
fur des messages... en fait on parle d'une chose dont on ne sait
rien, je parle du fichier, ni s'il est mis ou pas à jour, sa
fréquence de mise à jour, le nombre de tris par ligne, si les
enregistrement sont formatés, s'il peut être morcelé... tout ce qui
permettrait de se faire une idée.



Personnellement, la taille du fichier me donne déjà une idée
suffisante: avec 5 Mo de données, et comme je l'ai démontré dans les
exemples suivants, on peut envisager la pire des hyppothèses (mises
à jour ultra-fréquentes) : le temps de traitement "à la volée" reste
raisonnable. Si le fichier avait fait 50 ou 500 Mo, alors on aurait
eu besoin d'infos additionnelles.

En fait, c'est la synthèse de ce que je pense aussi, si tu ne dis
rien, la question n'est guère productive et te ramène de facto au
point de départ, à savoir que ce n'est que toi qui peut choisir
puisque tu ne donnes aucune information permettant réellement de
faire un choix.



Faux. Si les éléments donnés ne TE permettent pas de te faire une
idée, laisse faire ceux qui savent, si il y en a (et c'est le cas).

Sur ceci, tu confirmes en répondant que tu vas prendre le texteBox le



En plus, nul n'a réellement parlé d'un RTF à part toi, car on
l'utilise assez rarement, et davantage pour avoir la couleur et la
mise en forme qu'autre chose, son format est très proche de celui
d'un DOC, il faut mettre en ouvre un tas d'éléments et faire des
manipulations...



C'est faux, trivialement et grossièrement faux. Le controle RTF dispose
d'une foultitude de fonctions d'accès très simples. Tu ne sembles pas
les connaitre, Rosalie elle les connait. Fin de l'histoire.

Cordialement,

--
Jean-marc Noury (jean_marc_n2)
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
1 2 3