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 ?
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 ?
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 ?
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 ?
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 ?
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
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
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
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
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
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
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 :-)
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 :-)
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 a formulé ce dimanche :
Ok si c'est ça c'est super
Jean-marc a formulé ce dimanche :
Ok si c'est ça c'est super
Jean-marc a formulé ce dimanche :
Ok si c'est ça c'est super
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
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_' ; _no_spam_jean_marc_n2@yahoo.fr
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
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
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
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_' ; _no_spam_jean_marc_n2@yahoo.fr
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
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
>
Re
y'a t'il moyen de ne pas prendre en comptre la première ligne où dois
je l'enlever avant traitement
>
Re
y'a t'il moyen de ne pas prendre en comptre la première ligne où dois
je l'enlever avant traitement
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
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
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