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

question de rapidité

14 réponses
Avatar
John-Pet
Salut la communautée

j'ai deux fichiers texte comportant 259920 lignes
sur chaque ligne se trouve un nombre avec deux décimales(le séparateur
est un point)

je voudrais trouver une solution rapide pour avoir un résultat
d'opération entre chaque ligne des fichiers
ex:
result1 = sqr(ligne1fichier1^2 + ligne1fichier2^2)
etc

j'ai essayé en mettant les deux fichiers en mémoire puis opération
entre chaque ligne, cela prend un temps mais un
temps..............enfin bref trop de temps

une solution plus rapide est envisageable ?

JP


--
Adresse mail : john-pet@wanadoo.fr
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net

10 réponses

1 2
Avatar
Jean-marc
John-Pet wrote:
Salut la communautée

j'ai deux fichiers texte comportant 259920 lignes
sur chaque ligne se trouve un nombre avec deux décimales(le séparateur
est un point)

je voudrais trouver une solution rapide pour avoir un résultat
d'opération entre chaque ligne des fichiers
ex:
result1 = sqr(ligne1fichier1^2 + ligne1fichier2^2)
etc

j'ai essayé en mettant les deux fichiers en mémoire puis opération
entre chaque ligne, cela prend un temps mais un
temps..............enfin bref trop de temps

une solution plus rapide est envisageable ?



Hello,

peux tu définir "plus rapide" ? Par exemple donner un
temps en seconde qui te semble okay pour obtenir ton
résulat ?

Question subsidiaire: Que fait on des résultats ? Dans un
troisième fichier? En mémoire ?



--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
John-Pet
Après mure réflexion, Jean-marc a écrit :
John-Pet wrote:
Salut la communautée

j'ai deux fichiers texte comportant 259920 lignes
sur chaque ligne se trouve un nombre avec deux décimales(le séparateur
est un point)

je voudrais trouver une solution rapide pour avoir un résultat
d'opération entre chaque ligne des fichiers
ex:
result1 = sqr(ligne1fichier1^2 + ligne1fichier2^2)
etc

j'ai essayé en mettant les deux fichiers en mémoire puis opération
entre chaque ligne, cela prend un temps mais un
temps..............enfin bref trop de temps

une solution plus rapide est envisageable ?



Hello,

peux tu définir "plus rapide" ? Par exemple donner un
temps en seconde qui te semble okay pour obtenir ton
résulat ?

Question subsidiaire: Que fait on des résultats ? Dans un
troisième fichier? En mémoire ?



j'ai pas de temps prècis, mais pour le moment je suis ente 5 à 10 mn (
et oui ) si j'ai pas coupè avant

pour le troisième soit en mémoire soit dans un fichier, mais je crois
plus à un fichier car il y aura environ douze traitements de la sorte

PS les deux fichiers me donne les vecteurs vent pour le monde entier
à temps 0 et il y aura temps +3, +6 etc pour faire par la suite
une prévi méteo du vent sur l'ensemble du globe ou une partie du globe

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Jean-marc
John-Pet wrote:

j'ai pas de temps prècis, mais pour le moment je suis ente 5 à 10 mn (
et oui ) si j'ai pas coupè avant



Lolll !! On doit pouvoir faire mieux en effet :-)

pour le troisième soit en mémoire soit dans un fichier, mais je crois
plus à un fichier car il y aura environ douze traitements de la sorte



Ok, dans un fichier.

Donc on est d'accord: pour les tests, je créé 2 fichiers de
259920 lignes chacun, un nombre décimal (2 décimales) sur chaque
ligne, le séparateur étant un point.

On lit chauqe ligne de chaque fichier et je fais:
result1 = sqr(ligne1fichier1^2 + ligne1fichier2^2)

On présuppose que les fichiers sont ok et on supposera que les
2 fichiers ont le même nombre de lignes.
On écrit les résultats dans un 3eme fichier.

A tout à l'heure.

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
John-Pet wrote:
Après mure réflexion, Jean-marc a écrit :
j'ai pas de temps prècis, mais pour le moment je suis ente 5 à 10 mn (
et oui ) si j'ai pas coupè avant



Voila, c'est fait.

Je traite les 2 fichiers + production du fichier
résultat en 3 secondes (en debug).

Ce sera sans doute 2 secondes en compilé...

Je vais manger et je poste :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
John-Pet
Jean-marc a formulé ce dimanche :
John-Pet wrote:
Après mure réflexion, Jean-marc a écrit :
j'ai pas de temps prècis, mais pour le moment je suis ente 5 à 10 mn (
et oui ) si j'ai pas coupè avant



Voila, c'est fait.

Je traite les 2 fichiers + production du fichier
résultat en 3 secondes (en debug).

Ce sera sans doute 2 secondes en compilé...

Je vais manger et je poste :-)



Ok si c'est ça c'est super
merci

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Jean-marc
John-Pet wrote:
Jean-marc a formulé ce dimanche :
Ok si c'est ça c'est super



C'est bien ça!

Résultat des courses:

2 fichiers de 259920 lignes, produisant en sortie
un fichier résulat (même nombre de lignes évidemment),
le tout en 2,75 secondes...

Bon, j'ai mis à ta disposition un .zip avec un projet VB
prêt à l'emploi, ici :
http://users.skynet.be/candide/smooth/

Il contient un petit module de classe, le "Smooth File Reader",
qui permet de lire des gros fichiers texte de façon intelligente.

Il contient aussi la fonction prête à l'emploi pour ton processing
particulier:

'-----------------------------------------------
Function ProcessFiles(ByVal nameFile1 As String, _
ByVal nameFile2 As String, _
ByVal nameFile3 As String, _
ByRef linesProc As Long) As Boolean

Dim fic1 As CSmoothFileReader, fic2 As CSmoothFileReader
Dim ret1 As Boolean, ret2 As Boolean
Dim data1 As String, data2 As String
Dim v1 As Double, v2 As Double, result As Double
Dim f As Integer

Set fic1 = New CSmoothFileReader
fic1.OpenFile (nameFile1)

Set fic2 = New CSmoothFileReader
fic2.OpenFile (nameFile2)

f = FreeFile
Open nameFile3 For Output As #f

Do While True
ret1 = fic1.GetBufferNextLine(data1)
ret2 = fic2.GetBufferNextLine(data2)

If (ret1 And ret2) Then
v1 = Val(data1): v2 = Val(data2)
result = Sqr((v1 * v1 + v2 * v2))
Print #f, result
linesProc = linesProc + 1
Else
Exit Do
End If
Loop

Close #f

fic1.CloseFile: Set fic1 = Nothing
fic2.CloseFile: Set fic2 = Nothing

ProcessFiles = True

End Function
'-----------------------------------------------

Et enfin pour utiliser le tout un exemple tout simple:

'-----------------------------------------------
' test
'
Private Sub Command2_Click()
Dim fic1 As String, fic2 As String
Dim ficRes As String
Dim linesProcessed As Long
Dim ret As Boolean

fic1 = "c:data1.dat"
fic2 = "c:data2.dat"
ficRes = "c:result.dat"

ret = ProcessFiles(fic1, fic2, ficRes, _
linesProcessed)
If ret Then
MsgBox "Nombre de lignes traitées : " & linesProcessed
End If

End Sub
'-----------------------------------------------

Pour ceux que ça intérèsse, le Smooth File Reader est basé sur un
principe très simple : les controleurs disque d'aujourd'hui sont
des merveilles d'électronique et d'ingénierie. Il faut donc utiliser
cette puissance plutôt que de faire travailler le processeur, qui a
d'autres choses plus utiles à faire que d'allouer des centaines de
méga de RAM et saturer le controleur de disque!

Mon Smooth File reader lit sur disque des petits morceaux de données
(64 kilos par exemple) et à la demande, fournit des lignes en mémoire.
Quand il n'y a plus assez de données en mémoire, hop, il relit 64K.

Moralité: le controleur n'est pas saturé, le CPU reste libre pour autre
chose, on peut lire un fichier de 2 Go avec seulement une allocation de
64K, sans jamais utiliser plus de 30% du CPU.

Tout se passe de façon calme et synchronisée, DONC ultra rapide.
La preuve dans cet exemple, ou on passe d'un temps de 5 à 10 minutes
à seulement 3 secondes, et ça sans bloquer un seul instant le système!

Bon dimanche;

PS: je mets en Annexe après ma signature le code du module de classe.

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

ANNEXE : CSmoothFileReader.cls
------------------------------

'
' CSmoothFileReader.cls
'

Option Explicit

#Const NULLCHARSTOP = 0 ' Defines whether we
should trim the last line at nullchar!?
Private Const DEFAULT_CHUNCK_SIZE As Long = 65536 ' recommended value :
65536 for big files

Private m_chunk_size As Long ' Size of a piece of
data read from file
Private f_handle As Integer ' Handle to the file
being read
Private fpos As Long ' Current reading
location

Private Sub Class_Initialize()
m_chunk_size = DEFAULT_CHUNCK_SIZE
End Sub

'Property accessor : Set or defines the internal buffer size
Public Property Get BufferChunkSize() As Long
BufferChunkSize = m_chunk_size
End Property

Public Property Let BufferChunkSize(ByVal size As Long)
m_chunk_size = size
End Property

'Close the file being read
Public Function CloseFile() As Boolean
' Close and zero the handle
If f_handle <> 0 Then
Close #f_handle
f_handle = 0
End If

'Returns success
CloseFile = True
End Function

'Open the File at FileName
Public Function OpenFile(ByVal filename As String) As Boolean
'Get a new file handle and open the file given this handle
f_handle = FreeFile
Open filename For Binary Lock Write As #f_handle

'Reset the reading location
fpos = 1

'Returns success
OpenFile = True
End Function

'Read from file and return the full lines
Private Function GetBufferLines() As String
Static buf As String
Dim delta As Long
Dim the_line As String
Dim p_stop As Long

'Ensure the buffer to be allocated
If LenB(buf) = 0 Then
buf = Space$(m_chunk_size)
fpos = 1
End If

'Read to the end of the file, chunk by chunk
If Not EOF(f_handle) Then
Get #f_handle, fpos, buf

'Grow the buffer by a chunk size until a carriage return has been
found
delta = InStrRev(buf, vbCrLf)
While (delta = 0) And (Not EOF(f_handle))
m_chunk_size = m_chunk_size * 2 'We might want to decrease size
afterwards?
buf = Space$(m_chunk_size)
Get #f_handle, fpos, buf
delta = InStrRev(buf, vbCrLf)
Wend

'Save this read for the next time (useless as of fpos =
Seek(f_handle) - delta + 1)
'fpos = Seek(f_handle)

'Extract the line from the buffer
If delta = 0 Then
#If NULLCHARSTOP Then
p_stop = InStr(buf, vbNullChar)
If p_stop Then
the_line = Mid$(buf, 1, p_stop - 1)
Else
the_line = buf
End If
#Else
the_line = buf
#End If
Else
the_line = Mid$(buf, 1, delta - 1)
End If

'Save our read for the next time
delta = m_chunk_size - delta
fpos = Seek(f_handle) - delta + 1

GetBufferLines = the_line
Else
GetBufferLines = vbNullString
End If

End Function

'Read another line from our file (or a null string if nohing is to be read)
Public Function GetBufferNextLine(s As String) As Boolean
Static read_buffer As String
Static t() As String, ub As Long
Static must_read As Boolean
Static idx As Long

'If our buffer is empty, fetch content from the file and split it along
the lines
If (LenB(read_buffer) = 0) Or (must_read) Then
read_buffer = GetBufferLines
must_read = False
idx = 0
t() = Split(read_buffer, vbCrLf)
ub = UBound(t())

If ub = -1 Then
GetBufferNextLine = False
Exit Function
End If
End If

'Get a new line
s = t(idx)
GetBufferNextLine = True
idx = idx + 1

'Determine whether we are at the end of our buffer for the next fetch
If idx > ub Then
must_read = True
End If
End Function

Private Sub Class_Terminate()
CloseFile
End Sub
Avatar
John-Pet
Jean-marc a exposé le 13/04/2008 :
John-Pet wrote:
Jean-marc a formulé ce dimanche :
Ok si c'est ça c'est super



C'est bien ça!

Résultat des courses:

2 fichiers de 259920 lignes, produisant en sortie
un fichier résulat (même nombre de lignes évidemment),
le tout en 2,75 secondes...

Bon, j'ai mis à ta disposition un .zip avec un projet VB
prêt à l'emploi, ici :
http://users.skynet.be/candide/smooth/

Il contient un petit module de classe, le "Smooth File Reader",
qui permet de lire des gros fichiers texte de façon intelligente.

Il contient aussi la fonction prête à l'emploi pour ton processing
particulier:

'-----------------------------------------------
Function ProcessFiles(ByVal nameFile1 As String, _
ByVal nameFile2 As String, _
ByVal nameFile3 As String, _
ByRef linesProc As Long) As Boolean

Dim fic1 As CSmoothFileReader, fic2 As CSmoothFileReader
Dim ret1 As Boolean, ret2 As Boolean
Dim data1 As String, data2 As String
Dim v1 As Double, v2 As Double, result As Double
Dim f As Integer

Set fic1 = New CSmoothFileReader
fic1.OpenFile (nameFile1)

Set fic2 = New CSmoothFileReader
fic2.OpenFile (nameFile2)

f = FreeFile
Open nameFile3 For Output As #f

Do While True
ret1 = fic1.GetBufferNextLine(data1)
ret2 = fic2.GetBufferNextLine(data2)

If (ret1 And ret2) Then
v1 = Val(data1): v2 = Val(data2)
result = Sqr((v1 * v1 + v2 * v2))
Print #f, result
linesProc = linesProc + 1
Else
Exit Do
End If
Loop

Close #f

fic1.CloseFile: Set fic1 = Nothing
fic2.CloseFile: Set fic2 = Nothing

ProcessFiles = True

End Function
'-----------------------------------------------

Et enfin pour utiliser le tout un exemple tout simple:

'-----------------------------------------------
' test
'
Private Sub Command2_Click()
Dim fic1 As String, fic2 As String
Dim ficRes As String
Dim linesProcessed As Long
Dim ret As Boolean

fic1 = "c:data1.dat"
fic2 = "c:data2.dat"
ficRes = "c:result.dat"

ret = ProcessFiles(fic1, fic2, ficRes, _
linesProcessed)
If ret Then
MsgBox "Nombre de lignes traitées : " & linesProcessed
End If

End Sub
'-----------------------------------------------

Pour ceux que ça intérèsse, le Smooth File Reader est basé sur un
principe très simple : les controleurs disque d'aujourd'hui sont
des merveilles d'électronique et d'ingénierie. Il faut donc utiliser
cette puissance plutôt que de faire travailler le processeur, qui a
d'autres choses plus utiles à faire que d'allouer des centaines de
méga de RAM et saturer le controleur de disque!

Mon Smooth File reader lit sur disque des petits morceaux de données
(64 kilos par exemple) et à la demande, fournit des lignes en mémoire.
Quand il n'y a plus assez de données en mémoire, hop, il relit 64K.

Moralité: le controleur n'est pas saturé, le CPU reste libre pour autre
chose, on peut lire un fichier de 2 Go avec seulement une allocation de
64K, sans jamais utiliser plus de 30% du CPU.

Tout se passe de façon calme et synchronisée, DONC ultra rapide.
La preuve dans cet exemple, ou on passe d'un temps de 5 à 10 minutes
à seulement 3 secondes, et ça sans bloquer un seul instant le système!

Bon dimanche;

PS: je mets en Annexe après ma signature le code du module de classe.

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

ANNEXE : CSmoothFileReader.cls
------------------------------

'
' CSmoothFileReader.cls
'

Option Explicit

#Const NULLCHARSTOP = 0 ' Defines whether we
should trim the last line at nullchar!?
Private Const DEFAULT_CHUNCK_SIZE As Long = 65536 ' recommended value :
65536 for big files

Private m_chunk_size As Long ' Size of a piece of data
read from file
Private f_handle As Integer ' Handle to the file
being read
Private fpos As Long ' Current reading
location

Private Sub Class_Initialize()
m_chunk_size = DEFAULT_CHUNCK_SIZE
End Sub

'Property accessor : Set or defines the internal buffer size
Public Property Get BufferChunkSize() As Long
BufferChunkSize = m_chunk_size
End Property

Public Property Let BufferChunkSize(ByVal size As Long)
m_chunk_size = size
End Property

'Close the file being read
Public Function CloseFile() As Boolean
' Close and zero the handle
If f_handle <> 0 Then
Close #f_handle
f_handle = 0
End If

'Returns success
CloseFile = True
End Function

'Open the File at FileName
Public Function OpenFile(ByVal filename As String) As Boolean
'Get a new file handle and open the file given this handle
f_handle = FreeFile
Open filename For Binary Lock Write As #f_handle

'Reset the reading location
fpos = 1

'Returns success
OpenFile = True
End Function

'Read from file and return the full lines
Private Function GetBufferLines() As String
Static buf As String
Dim delta As Long
Dim the_line As String
Dim p_stop As Long

'Ensure the buffer to be allocated
If LenB(buf) = 0 Then
buf = Space$(m_chunk_size)
fpos = 1
End If

'Read to the end of the file, chunk by chunk
If Not EOF(f_handle) Then
Get #f_handle, fpos, buf

'Grow the buffer by a chunk size until a carriage return has been
found
delta = InStrRev(buf, vbCrLf)
While (delta = 0) And (Not EOF(f_handle))
m_chunk_size = m_chunk_size * 2 'We might want to decrease size
afterwards?
buf = Space$(m_chunk_size)
Get #f_handle, fpos, buf
delta = InStrRev(buf, vbCrLf)
Wend

'Save this read for the next time (useless as of fpos =
Seek(f_handle) - delta + 1)
'fpos = Seek(f_handle)

'Extract the line from the buffer
If delta = 0 Then
#If NULLCHARSTOP Then
p_stop = InStr(buf, vbNullChar)
If p_stop Then
the_line = Mid$(buf, 1, p_stop - 1)
Else
the_line = buf
End If
#Else
the_line = buf
#End If
Else
the_line = Mid$(buf, 1, delta - 1)
End If

'Save our read for the next time
delta = m_chunk_size - delta
fpos = Seek(f_handle) - delta + 1

GetBufferLines = the_line
Else
GetBufferLines = vbNullString
End If

End Function

'Read another line from our file (or a null string if nohing is to be read)
Public Function GetBufferNextLine(s As String) As Boolean
Static read_buffer As String
Static t() As String, ub As Long
Static must_read As Boolean
Static idx As Long

'If our buffer is empty, fetch content from the file and split it along
the lines
If (LenB(read_buffer) = 0) Or (must_read) Then
read_buffer = GetBufferLines
must_read = False
idx = 0
t() = Split(read_buffer, vbCrLf)
ub = UBound(t())

If ub = -1 Then
GetBufferNextLine = False
Exit Function
End If
End If

'Get a new line
s = t(idx)
GetBufferNextLine = True
idx = idx + 1

'Determine whether we are at the end of our buffer for the next fetch
If idx > ub Then
must_read = True
End If
End Function

Private Sub Class_Terminate()
CloseFile
End Sub



Un grand merci pour ce morceau de code, du grand art
j'ai juste changé le vbCrLf par vbCr car les fichiers sont au format
unix, et aussi un round pour le retour du résultat avec deux décimales
C'est très très rapide, celà me suffit amplement, je vais mettre plus
de temps à DL les fichiers sur la NOAA LOL

merci encore

JP

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
John-Pet
Jean-marc a couché sur son écran :
John-Pet wrote:
Jean-marc a formulé ce dimanche :
Ok si c'est ça c'est super



C'est bien ça!

Résultat des courses:

2 fichiers de 259920 lignes, produisant en sortie
un fichier résulat (même nombre de lignes évidemment),
le tout en 2,75 secondes...

Bon, j'ai mis à ta disposition un .zip avec un projet VB
prêt à l'emploi, ici :
http://users.skynet.be/candide/smooth/

Il contient un petit module de classe, le "Smooth File Reader",
qui permet de lire des gros fichiers texte de façon intelligente.

Il contient aussi la fonction prête à l'emploi pour ton processing
particulier:

'-----------------------------------------------
Function ProcessFiles(ByVal nameFile1 As String, _
ByVal nameFile2 As String, _
ByVal nameFile3 As String, _
ByRef linesProc As Long) As Boolean

Dim fic1 As CSmoothFileReader, fic2 As CSmoothFileReader
Dim ret1 As Boolean, ret2 As Boolean
Dim data1 As String, data2 As String
Dim v1 As Double, v2 As Double, result As Double
Dim f As Integer

Set fic1 = New CSmoothFileReader
fic1.OpenFile (nameFile1)

Set fic2 = New CSmoothFileReader
fic2.OpenFile (nameFile2)

f = FreeFile
Open nameFile3 For Output As #f

Do While True
ret1 = fic1.GetBufferNextLine(data1)
ret2 = fic2.GetBufferNextLine(data2)

If (ret1 And ret2) Then
v1 = Val(data1): v2 = Val(data2)
result = Sqr((v1 * v1 + v2 * v2))
Print #f, result
linesProc = linesProc + 1
Else
Exit Do
End If
Loop

Close #f

fic1.CloseFile: Set fic1 = Nothing
fic2.CloseFile: Set fic2 = Nothing

ProcessFiles = True

End Function
'-----------------------------------------------

Et enfin pour utiliser le tout un exemple tout simple:

'-----------------------------------------------
' test
'
Private Sub Command2_Click()
Dim fic1 As String, fic2 As String
Dim ficRes As String
Dim linesProcessed As Long
Dim ret As Boolean

fic1 = "c:data1.dat"
fic2 = "c:data2.dat"
ficRes = "c:result.dat"

ret = ProcessFiles(fic1, fic2, ficRes, _
linesProcessed)
If ret Then
MsgBox "Nombre de lignes traitées : " & linesProcessed
End If

End Sub
'-----------------------------------------------

Pour ceux que ça intérèsse, le Smooth File Reader est basé sur un
principe très simple : les controleurs disque d'aujourd'hui sont
des merveilles d'électronique et d'ingénierie. Il faut donc utiliser
cette puissance plutôt que de faire travailler le processeur, qui a
d'autres choses plus utiles à faire que d'allouer des centaines de
méga de RAM et saturer le controleur de disque!

Mon Smooth File reader lit sur disque des petits morceaux de données
(64 kilos par exemple) et à la demande, fournit des lignes en mémoire.
Quand il n'y a plus assez de données en mémoire, hop, il relit 64K.

Moralité: le controleur n'est pas saturé, le CPU reste libre pour autre
chose, on peut lire un fichier de 2 Go avec seulement une allocation de
64K, sans jamais utiliser plus de 30% du CPU.

Tout se passe de façon calme et synchronisée, DONC ultra rapide.
La preuve dans cet exemple, ou on passe d'un temps de 5 à 10 minutes
à seulement 3 secondes, et ça sans bloquer un seul instant le système!

Bon dimanche;

PS: je mets en Annexe après ma signature le code du module de classe.

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

ANNEXE : CSmoothFileReader.cls
------------------------------

'
' CSmoothFileReader.cls
'

Option Explicit

#Const NULLCHARSTOP = 0 ' Defines whether we
should trim the last line at nullchar!?
Private Const DEFAULT_CHUNCK_SIZE As Long = 65536 ' recommended value :
65536 for big files

Private m_chunk_size As Long ' Size of a piece of data
read from file
Private f_handle As Integer ' Handle to the file
being read
Private fpos As Long ' Current reading
location

Private Sub Class_Initialize()
m_chunk_size = DEFAULT_CHUNCK_SIZE
End Sub

'Property accessor : Set or defines the internal buffer size
Public Property Get BufferChunkSize() As Long
BufferChunkSize = m_chunk_size
End Property

Public Property Let BufferChunkSize(ByVal size As Long)
m_chunk_size = size
End Property

'Close the file being read
Public Function CloseFile() As Boolean
' Close and zero the handle
If f_handle <> 0 Then
Close #f_handle
f_handle = 0
End If

'Returns success
CloseFile = True
End Function

'Open the File at FileName
Public Function OpenFile(ByVal filename As String) As Boolean
'Get a new file handle and open the file given this handle
f_handle = FreeFile
Open filename For Binary Lock Write As #f_handle

'Reset the reading location
fpos = 1

'Returns success
OpenFile = True
End Function

'Read from file and return the full lines
Private Function GetBufferLines() As String
Static buf As String
Dim delta As Long
Dim the_line As String
Dim p_stop As Long

'Ensure the buffer to be allocated
If LenB(buf) = 0 Then
buf = Space$(m_chunk_size)
fpos = 1
End If

'Read to the end of the file, chunk by chunk
If Not EOF(f_handle) Then
Get #f_handle, fpos, buf

'Grow the buffer by a chunk size until a carriage return has been
found
delta = InStrRev(buf, vbCrLf)
While (delta = 0) And (Not EOF(f_handle))
m_chunk_size = m_chunk_size * 2 'We might want to decrease size
afterwards?
buf = Space$(m_chunk_size)
Get #f_handle, fpos, buf
delta = InStrRev(buf, vbCrLf)
Wend

'Save this read for the next time (useless as of fpos =
Seek(f_handle) - delta + 1)
'fpos = Seek(f_handle)

'Extract the line from the buffer
If delta = 0 Then
#If NULLCHARSTOP Then
p_stop = InStr(buf, vbNullChar)
If p_stop Then
the_line = Mid$(buf, 1, p_stop - 1)
Else
the_line = buf
End If
#Else
the_line = buf
#End If
Else
the_line = Mid$(buf, 1, delta - 1)
End If

'Save our read for the next time
delta = m_chunk_size - delta
fpos = Seek(f_handle) - delta + 1

GetBufferLines = the_line
Else
GetBufferLines = vbNullString
End If

End Function

'Read another line from our file (or a null string if nohing is to be read)
Public Function GetBufferNextLine(s As String) As Boolean
Static read_buffer As String
Static t() As String, ub As Long
Static must_read As Boolean
Static idx As Long

'If our buffer is empty, fetch content from the file and split it along
the lines
If (LenB(read_buffer) = 0) Or (must_read) Then
read_buffer = GetBufferLines
must_read = False
idx = 0
t() = Split(read_buffer, vbCrLf)
ub = UBound(t())

If ub = -1 Then
GetBufferNextLine = False
Exit Function
End If
End If

'Get a new line
s = t(idx)
GetBufferNextLine = True
idx = idx + 1

'Determine whether we are at the end of our buffer for the next fetch
If idx > ub Then
must_read = True
End If
End Function

Private Sub Class_Terminate()
CloseFile
End Sub



Re

y'a t'il moyen de ne pas prendre en comptre la première ligne où dois
je l'enlever avant traitement

JP

--
Adresse mail :
Ceci est une signature automatique de MesNews.
Site : http://www.mesnews.net
Avatar
Jean-marc
>
Re

y'a t'il moyen de ne pas prendre en comptre la première ligne où dois
je l'enlever avant traitement



Si il y a toujours une première ligne superflue dans les
2 fichiers, il te suffit de modifier la fonction
ProcessFile et d'ajouter:

ret1 = fic1.GetBufferNextLine(data1)
ret2 = fic2.GetBufferNextLine(data2)

Juste avant le Do

Comme ça, tu lis la première ligne sans rien en faire et le
process suit pour le reste.

Voila :-)

--
Jean-marc Noury (jean_marc_n2)
Microsoft MVP - Visual Basic
FAQ VB: http://faq.vb.free.fr/
mailto: remove '_no_spam_' ;
Avatar
Jean-marc
John-Pet wrote:
Jean-marc a exposé le 13/04/2008 :
John-Pet wrote:
Jean-marc a formulé ce dimanche :





Un grand merci pour ce morceau de code, du grand art
j'ai juste changé le vbCrLf par vbCr car les fichiers sont au format
unix, et aussi un round pour le retour du résultat avec deux décimales
C'est très très rapide, celà me suffit amplement, je vais mettre plus
de temps à DL les fichiers sur la NOAA LOL
merci encore



Merci pour le retour :-)

Bon dimanche;

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