Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1776to1780
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

CSV Import in Datenfeld

CSV Import in Datenfeld
28.08.2020 17:08:15
Manuel
Hallo zusammen
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.

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: CSV Import in Datenfeld
28.08.2020 18:52:53
Günther
Moin Manuel,
da ich nicht weiß, die du "Datenfeld" definierst, nehme ich einfach mal an dass du ein Range meinst. Und da frage ich mich, warum du den Weg über VBA gehst. Mit Power Query sollte das problemlos(er) möglich sein.
 
Gruß
Günther  |  mein Excel-Blog
AW: CSV Import in Datenfeld
28.08.2020 19:37:57
Dieter
Hallo Manuel,
kannst du eine csv-Datei für einen Test hochladen?
Viele Grüße
Dieter
AW: CSV Import in Datenfeld
28.08.2020 22:13:08
Rudi
vermutlich sind die Zeilenumbrüche in der csv chr(10) und nicht chr(13)
AW: CSV Import in Datenfeld
29.08.2020 00:15:06
Oberschlumpf
Hi Manuel,
du schreibst in deinem Code in dieser Reihenfolge diese Zeilen:

ErsteZeile = True
Open "C:\Users\Manuel\Desktop\export.csv" For Input As #FileNumber
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
Ende:
Loop
'CSV schliessen
Close #1
Siehst du den Fehler?
Schon nach Einlesen der 1. Zeile (Überschriften) gehst du schon wieder raus aus der csv-Datei.
Hab jetzt keine Codeverbesserung, weil schon spät - aber vielleicht findest du ja auch ne Lösung.
Ciao
Thorsten
Anzeige
AW: CSV Import in Datenfeld
29.08.2020 00:39:32
Manuel
Hallo zusammen
Vielen Dank für die Antworten
@Günther
Mit Datenfeld meine ich ein Array wie zum Beispiel
Dim Str(1 to 5) as String

Die Daten stammen von einem Stromzähler. Sinn der Tabelle sollte es sein, diverse Kenndaten aus diesen Daten zu ziehen und sauber darzustellen. Und das geht, soweit ich weiss nicht so schön per Power Query wie mit einer Formel in einer Zelle. Und mit schön meine ich nicht nur grafisch, sonder auch betreffend Arbeitsschritte, die dazu nötig sind.
@Dieter Klemke
Geht wegen der Speicherplatzbeschränkung leider nicht in voller Grösse. Und mit dem verkleinerten hochgeladenen File verhält es sich nicht wie beschrieben.
https://www.herber.de/bbs/user/139899.zip
Beim Verkleinden der Datei habe ich zudem festgestellt, dass das Makro funktioniert, wenn ich eine Spalte lösche. (Bei gleicher Zeilenanzahl) Nach weiterem Debugging ist mir aufgefallen, dass es auch ein Herauslöschen von einzelnen Zeichen tut. Bedeutet dies, dass ein .csv-File nur eine gewisse Anzahl Zeichen pro Zeile zulässt? (470 Zeichen scheinen zu viel zu sein. Ungefähr 450 sollten allerdings funktionieren.)
Kann ich dies Restriktion irgendwie umgehen?
Das CSV lässt sich leider nur sehr schlecht ändern, da die Generierung davon ausserhalb meiner Macht liegt. Desshalb wohl auch die Probleme mit der Codierung der Sonderzeichen.
Weniger Zeilen in einem File zu haben ist leider nicht wirklich eine Option, da ich gerne einen ganzen Monat auf einmal berabeiten möchte. Weniger Spalten würde ev. funktionieren. Kenne aber keine Methode dazu.
@Rudi Maintaire
Kann ich nur schlecht beurteilen. Eventuell hilft hier das angehängte File.
@Thorsten
Sollte doch eigentlich funktionieren, da die Sprungmarke vor dem Loop liegt, und die Schleife folglich weiterlaufen sollte. Die Sprungmarke hat mich aber auch gestört und desshalb habe ich noch ein wenig umgebaut. Verhält sich aber genau gleich.
Vieleicht ist es aber definiv schon zu spät und ich sehe meinen Logikfehler nicht mehr.
...
ErsteZeile = True
Open "C:\Users\Manuel\Desktop\CSV-Forum.csv" For Input As #FileNumber
Do While Not (EOF(FileNumber))
Line Input #FileNumber, Zeile
If ErsteZeile Then
ErsteZeile = False
Else
'Behandle die Daten gemäss altem Makro oben
End If
Loop
'CSV schliessen
Close #1
Vielen Dank nochmal
Manuel
Anzeige
AW: CSV Import in Datenfeld
29.08.2020 01:35:21
Oberschlumpf
Hi Manuel,
jep, vergiss meinen Einwand - du hast recht.
:Ende kommt vor Loop
Is zu spät! :-)
Ciao
Thorsten
AW: CSV Import in Datenfeld
29.08.2020 14:45:20
Dieter
Hallo Manuel,
in der Anlage füge ich dir ein Programm bei mit dem du z.B. die ersten 10000 Zeichen deiner csv-Datei auflisten kannst, um genauer zu schauen, wie sie aufgebaut ist.
Vielleicht kommst du damit etwas weiter.
https://www.herber.de/bbs/user/139903.xlsm
Viele Grüße
Dieter
AW: CSV Import in Datenfeld
29.08.2020 10:31:05
Anton
Hallo Manuel,
probier's hiermit:
Code in Zwischenablage:

Option Explicit
Sub b()
  Dim fso As Object, f As Object, lZeile As Long    
  Dim datei As String, inhalt As String, sZeilen() As String, Speicher() As String  
  Set fso = CreateObject("Scripting.FileSystemObject")  
  datei = "C:\Users\Anton\Desktop\Testordner\Neuer Ordner\CSV-Forum.csv"   'anpassen
  Set f = fso.OpenTextFile(datei, 1, True)  
  inhalt = f.readall 'Inhalt der CSV einlesen
  f.Close
  sZeilen = Split(inhalt, vbCrLf)
  If UBound(sZeilen) = 0 Then sZeilen = Split(inhalt, vbLf)  
  For lZeile = 1 To UBound(sZeilen)  
    Debug.Print sZeilen(lZeile)  'ab der 2.Zeile im Direktfenster ausgeben
    Speicher = Split(sZeilen(lZeile), ";")      'Zeile auftrennen
   'usw
  Next
  Set fso = Nothing  
End Sub

mfg Anton
Anzeige
AW: CSV Original ist vermutlich UNIX Format
29.08.2020 11:31:25
EtoPHG
Hallo Manuel,
Lies mal den Thread "Verarbeitung grosser CSV Datei...". Ich vermute, auch deine Datei stammt von einem Unix-System.
Ich bin aber auch der Meinung von Günther, dass PQ hier die bessere Alternative wäre.
Gruess Hansueli
AW: CSV Original ist vermutlich UNIX Format
29.08.2020 14:56:28
Manuel
Hallo zusammen
@Anton und @Hansueli
Wenn ich das richtig verstehe handelt es sich tatsächlich um eine Unixdatei. Mit dem Makro von Anton lässt sie sich aber einlesen.
@Dieter Klemke
Interessante Datei, hoffe die hast du nicht nur für mich geschrieben.
Vielen Dank für eure Hife.
Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige