Hallo zusammen,
da ich mit googln auch nicht weiter komme, poste ich mein Problem. Vielleicht hat ja einer von euch eine geniale Idee :D
In einer csv.Datei (Fehlerliste) befinden sich Materialnummern. Diese Datei variiert zwischen 20MB..... 300MB. Die Datensätze sind durch HEX'0A' von einander gtrennt. Diese Datei soll eingelesen werden. Als Ergebniss soll heraus kommen, WELCHE Materialnummern vorkommen und WIE OFT.
Also die Form:
Nummer Anzahl
12345 45
155456 3
2364455 12
.....
PROBLEM: Das dauert ewig !!! 500 Datensätze zu verarbeiten dauern 51s. Ich hab aber mindestens 8.000 Datensätze. Wie kann ich das schneller machen ??????????????? Hab schon alles versucht, doch DER Zeitfresser liegt im While...Wend Teil.
Hat jemand von euch eine Idee ??????
Gruß
Private Sub Befehl1154_Click()
On Error GoTo Error_Befehl1154_Click
Dim bytFile As Byte
Dim strFile As String
Dim colErrorList As Collection
Dim strInputF As String
Dim strErrAnz As String
Dim dblErrors As Double
Dim FileLength
strFile = Me.Text1151.Value
bytFile = FreeFile
Set colErrorList = New Collection
Open strFile For Input As bytFile
FileLength = LOF(bytFile)
strInputF = Input(FileLength, bytFile)
Close #bytFile
Dim strSearch0A As String
Dim strSearch3B As String
Dim strSearch3Bb As String
Dim strSearch20 As String
Dim strSearchTXT As String
Dim strSearchErg As String
Dim lngPosStart0A As Long
Dim lngPosErg0A As Long
Dim lngPosErg20 As Long
strSearch0A = Chr$(10): strSearch20 = " ": strSearch3B = ";"
lngPosStart0A = 1: lngPosErg0A = 1
strSearchTXT = ".: AT": strErrAnz = 1
Dim dblZAEHLER As Integer
dblZAEHLER = 0
vntStartZeit = Now
While lngPosErg0A <> 0
lngPosErg0A = InStr(lngPosStart0A, strInputF, strSearchTXT)
lngPosErg20 = InStr(lngPosErg0A + 4, strSearch20)
strSearchErg = Mid$(strInputF, lngPosErg0A + 5, lngPosErg20 - lngPosErg0A - 5)
lngPosStart0A = lngPosErg0A + 1
colErrorList.Add strErrAnz, strSearchErg
dblZAEHLER = dblZAEHLER + 1
If dblZAEHLER = 500 Then GoTo Error_Befehl1154_Click
Wend
Call Zeitnahme
' Debug.Print dblZAEHLER, strSearchErg, colErrorList(strErrNum)
Set colErrorList = Nothing
Exit_Befehl1154_Click:
Exit Sub
Error_Befehl1154_Click:
If Err.Number = 457 Then GoTo Error_457
Call Zeitnahme
MsgBox Err.Number
Set colErrorList = Nothing
Resume Exit_Befehl1154_Click:
Error_457:
dblErrors = CDbl(colErrorList(strSearchErg))
dblErrors = dblErrors + 1
strErrAnz = CStr(dblErrors)
colErrorList.Remove (strSearchErg)
colErrorList.Add strErrAnz, strSearchErg
Resume Next
End Sub
Ich hab es über bytweises Einlesen und natürlich Anpassung aller Algorithmen hinbekommen.
Für die Verarbeitung von 28.420 Datensätzen (Größe der csv-Datei: 29,933MB) werden nur noch 27Sekunden benötigt. Ist ein beträchtlicher Zeitunterschied aber falls jemand noch eine besserer Optimierung weiss, bin ich natürlich sehr dankbar !!!
Gruss