Ich möchte gerne ein Logfile in eine Datenfeld importieren um später daraus mit einer Tabellenfunktion gewisse Kenndaten auslesen zu können. Da es sehr viele Logs gibt, denke ich dass es sinnvoll ist, diese nur einmal zu importieren und bereits ein wenig zusammenzufassen und anschliessend mit den Funktionen auf das Datenfeld zurückzugreifen.
Das Logfile liegt als Semikolongetrennte .csv-Datei vor. In der ersten Zeile stehen die Überschriften jeder Spalte. Die interessieren mich momentan jedoch noch nicht wirklich.
In der ersten Spalte kommt jeweils das Datum inklusive Uhrzeit, an welchem der Log verzeichnet wurde. Es wird in etwa alle 30 Sekunden gelogt. In den folgenden Spalten kommen die Variabeln. Die Anzahl davon kann sich jedoch von File zu File unterscheiden.
Zum besseren Verständniss habe ich unten die Struktur aufgezeigt.
Was ich nun tun möchte ist, zu jedem Datum für jede Variable das Maximum, das Minimum, die Gesamtsumme und die Anzahl zu errechnen und in einem Datenfeld abzuspeichern.
Dafür habe ich den Code unten geschrieben. Allerdings wird die Schleife nur für die erste Zeile abgearbeitet, bevor EOF True ausgibt und die Schleife damit beendet. Selbst wenn mein File mehrere Tausend Zeilen hat.
Hat jemand eine Idee, was ich noch falsch mache?
Vielen Dank für die Antworten
Manuel Roth
Mein Code
Option Explicit
Type Satz
Max As Integer
Min As Integer
Num As Integer
Sum As Integer
End Type
Type Daten
Datum As Date
T() As Satz
End Type
Public D() As Daten
Sub CsvImport()
Dim Zeile As String
Dim i As Long, k As Integer, dat As Integer
Dim Speicher() As String
Dim ErsteZeile As Boolean, FileNumber As Variant
'Initialisierungen
ErsteZeile = True
Erase D
'CSV öffnen
FileNumber = FreeFile
Open "C:\Users\Manuel\Desktop\export.csv" For Input As #FileNumber
'Datenfeld abfüllen
Do While Not (EOF(FileNumber))
Line Input #FileNumber, Zeile 'Zeile in Variable laden
'Erste Zeile überspringen
If ErsteZeile Then
ErsteZeile = False
GoTo Ende
End If
Speicher = Split(Zeile, ";") 'Zeile auftrennen
If dat = Application.RoundDown(Speicher(0), 0) Then 'Gleiches Datum wie vorheriger Input
'-> Ev. Max/Min neu schreiben, Summe und Anzahl erhöhen
For k = 1 To UBound(Speicher)
If D(i).T(k).Max Speicher(k) Then D(i).T(k).Min = Speicher(k)
D(i).T(k).Sum = D(i).T(k).Sum + Speicher(k)
D(i).T(k).Num = D(i).T(k).Num + 1
Next k
Else 'Neuer Tag -> Neuer Eintrag ins Datenfeld
ReDim Preserve D(0 To i)
ReDim Preserve D(i).T(1 To UBound(Speicher))
D(i).Datum = Application.RoundDown(Speicher(0), 0)
For k = 1 To UBound(Speicher)
D(i).T(k).Max = Speicher(k)
D(i).T(k).Min = Speicher(k)
D(i).T(k).Sum = Speicher(k)
D(i).T(k).Num = 1
Next k
i = i + 1
End If
Ende:
Loop
'CSV schliessen
Close #1
End Sub
Struktur der Inputdaten
Logzeit Var1 Var2 Var3 usw.
44028.59907 4899 11 768
44028.59942 4317 10 767
44028.59977 3543 9 714
44028.60012 2654 8 743
44028.60046 2652 8 751
44028.60081 2656 8 743
44028.60116 2662 8 745
44028.61458 2226 54 7
44028.61493 2196 6 7
44028.61528 2182 6 8
44028.61563 2176 1217 314
usw.