Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Suche in großen Dateien

Begonnen von Lexboro, Juli 22, 2010, 15:47:35

⏪ vorheriges - nächstes ⏩

Lexboro

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

Lexboro

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