
26705
13.11.2007, aktualisiert am 18.11.2007
Variablen mit Visual Basic aus Textdatei auslesen
Hallo Leute,
ich habe ein VB-Problem beim Auslesen von großen Textdateien.
Diese Textdateien sind wie folgt aufgebaut:
Diese Textdateien haben mehrere Tausen Zeilen und ich möchte nur die Werte einiger weniger Variablen auslesen und je Datensatz eine Zeile in eine .csv-Datei schreiben.
Es sollen auch die Werte einer Variablen jeweils nur in eine Spalte geschrieben werden, das klappt auch, sieht dann ungefähr so aus:
Alle Variablen sind vom Typ String und bis auf meine Problemvariable (hier mal "Variable_6" genannt) kommen sie je Datensatz nur ein Mal vor.
Das ganze frage ich mit einigen If-Anweisungen innerhalb einer Do-While-Schleife ab, die meine .csv-Datei jeweils um eine Spalte (Wert, ";") bzw. bei einem neuen Datensatz um eine Zeile ergänzen.
Hier ist das Problem:
Die Probleme bereitet mir nun Variable_6. Sie kommt innerhalb eines Datensatzes 0-4 mal mit verschiedenen Werten vor.
Insgesamt kann sie ca. 20 verschiedene Werte je Textdatei annehmen.
Nun ist es ja keine Problem sie einfach auszulesen: "Guck nach, ist sie da, hat sie nen Wert, wenn ja füg den Wert in die Zeile ein".
Allerdings sollen die Werte dieser Variablen nach Spalten sortiert werden. d.h. gleiche Werte sollen untereinander stehen.
Wenn kein Wert vorhanden ist soll das Feld leer bleiben, so ungefähr:
Das sollte doch eigentlich über Arrays machbar sein. Mir fehlt da wahrscheinlich noch ne Menge Erfahrung, aber ich komme im Moment einfach nicht weiter.
Ich hoffe, dass ich meine Sorgen verständlich formuliert habe und bin für jede Idee dankbar.
Gruß,
Seppel
ich habe ein VB-Problem beim Auslesen von großen Textdateien.
Diese Textdateien sind wie folgt aufgebaut:
Datensatz_eins
Variable_1 Wert_1
...
Variable_5 Wert_5
Variable_6 Wert_will_haben_1
Variable_7 Wert_7
Variable_6 Wert_will_haben_2
Variable_8 Wert_9
Variable_6 Wert_will_haben_3
Variable_9 Wert_11
Datensatz_zwei
Variable_1 Wert_12
...
Variable_5 Wert_16
Variable_6 Wert_will_haben_2
Variable_7 Wert_18
Variable_6 Wert_will_haben_3
Variable_8 Wert_20
Variable_6 Wert_will_haben_4
Variable_9 Wert_22
Datensatz_drei...usw...
Variable_1 Wert_1
...
Variable_5 Wert_5
Variable_6 Wert_will_haben_1
Variable_7 Wert_7
Variable_6 Wert_will_haben_2
Variable_8 Wert_9
Variable_6 Wert_will_haben_3
Variable_9 Wert_11
Datensatz_zwei
Variable_1 Wert_12
...
Variable_5 Wert_16
Variable_6 Wert_will_haben_2
Variable_7 Wert_18
Variable_6 Wert_will_haben_3
Variable_8 Wert_20
Variable_6 Wert_will_haben_4
Variable_9 Wert_22
Datensatz_drei...usw...
Diese Textdateien haben mehrere Tausen Zeilen und ich möchte nur die Werte einiger weniger Variablen auslesen und je Datensatz eine Zeile in eine .csv-Datei schreiben.
Es sollen auch die Werte einer Variablen jeweils nur in eine Spalte geschrieben werden, das klappt auch, sieht dann ungefähr so aus:
Datensatz | Variable_1 | Variable_5 | ... |
---|---|---|---|
Datensatz_eins | Wert_1 | Wert_5 | ... |
Datensatz_zwei | Wert_12 | Wert_16 | ... |
Alle Variablen sind vom Typ String und bis auf meine Problemvariable (hier mal "Variable_6" genannt) kommen sie je Datensatz nur ein Mal vor.
Das ganze frage ich mit einigen If-Anweisungen innerhalb einer Do-While-Schleife ab, die meine .csv-Datei jeweils um eine Spalte (Wert, ";") bzw. bei einem neuen Datensatz um eine Zeile ergänzen.
Do While (lineInput <> Nothing)
If lineInput.StartsWith(Datensatz) Then
sw.Write(CrLf & (lineInput.Substring(21, 19) & ";"))
lineInput = sr.ReadLine()
End If
If InStr(lineInput, Variable_1) Then
sw.Write(SplitArray(lineInput, " ", 1) & ";")
lineInput = sr.ReadLine()
End If
usw.
Hier ist das Problem:
Die Probleme bereitet mir nun Variable_6. Sie kommt innerhalb eines Datensatzes 0-4 mal mit verschiedenen Werten vor.
Insgesamt kann sie ca. 20 verschiedene Werte je Textdatei annehmen.
Nun ist es ja keine Problem sie einfach auszulesen: "Guck nach, ist sie da, hat sie nen Wert, wenn ja füg den Wert in die Zeile ein".
Allerdings sollen die Werte dieser Variablen nach Spalten sortiert werden. d.h. gleiche Werte sollen untereinander stehen.
Wenn kein Wert vorhanden ist soll das Feld leer bleiben, so ungefähr:
Datensatz | ... | Variable_6 | Variable_6 | Variable_6 | Variable_6 |
---|---|---|---|---|---|
Datensatz_eins | ... | Wert_1 | Wert_5 | ||
Datensatz_zwei | ... | Wert_5 | Wert_7 | Wert_8 | |
Datensatz_drei | ... | Wert_1 | Wert_7 | Wert_8 | |
Datensatz_vier | ... | Wert_8 |
Das sollte doch eigentlich über Arrays machbar sein. Mir fehlt da wahrscheinlich noch ne Menge Erfahrung, aber ich komme im Moment einfach nicht weiter.
Ich hoffe, dass ich meine Sorgen verständlich formuliert habe und bin für jede Idee dankbar.
Gruß,
Seppel
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 73457
Url: https://administrator.de/forum/variablen-mit-visual-basic-aus-textdatei-auslesen-73457.html
Ausgedruckt am: 28.04.2025 um 08:04 Uhr
9 Kommentare
Neuester Kommentar
Hallo SeppelCeh!
Da Du nicht angeführt hast, welcher Art die Werte "Wert_1", ... sind, ganz allgemein (und total ungetestet): Zunächst vorweg ein Array für alle möglichen Werte erstellen mit
Nachdem Du in der Einlese-Schleife den Wert für "Variable_6" gefunden hast (strGelesenerWert), in einer weiteren Schleife den Index suchen:
Mit der String-Funktion wird eine entsprechende Anzahl zusätzlicher Trennzeichen (im Beispiel ";", schöner natürlich als Variable) erzeugt, welche bei der Ausgabe der Ergebniszeile dann etwa so verwendet werden können:
Grüße
bastla
[Edit] Dieses "set" stand vorhin unsinnigerweise noch oben in der ersten Code-Zeile - dafür fehlte aber "Array(" ... [/Edit]
Da Du nicht angeführt hast, welcher Art die Werte "Wert_1", ... sind, ganz allgemein (und total ungetestet): Zunächst vorweg ein Array für alle möglichen Werte erstellen mit
arrCheck = Array("Wert_1", "Wert_2", ..., "Wert_n")
intIndex = -1
For i = 0 To UBound(arrCheck)
If strGelesenerWert = arrCheck(i) Then
intIndex = i
Exit For
End If
Next
If intIndex = -1 Then 'Nicht gefunden - weitere Vorgangsweise selbst festlegen
strExtraDelims = String(intIndex, ";")
objCSVFile.WriteLine strDatensatz & ";" & strWasWeissIch & ";" & strExtraDelims & strGelesenerWert
Grüße
bastla
[Edit] Dieses "set" stand vorhin unsinnigerweise noch oben in der ersten Code-Zeile - dafür fehlte aber "Array(" ... [/Edit]
Hallo SeppelCeh!
Sorry - war vorhin leider auf der Flucht und mit einem Bein sowie dem Großteil der grauen Zellen schon aus der Tür ...
Deshalb habe ich auch nicht darauf geachtet, dass mehrere Werte je Datensatz vorkommen können.
Die folgende Variante sollte jetzt aber eher passen:
Zum Testen (der Code soll stand-alone lauffähig sein) simuliere ich die Inhalte der Variablen "strEingelesenerWert" (welche Du aus dem zuletzt gelesenen Datensatz erhältst) durch ein Array mit Beispieldaten (inkl einem nicht vorgesehen Wert). Auch die Schleife zum Einlesen selbst ist nur angedeutet.
Nachdem alle Werte des aktuellen Datensatzes durchlaufen sind, wird in "strVariable_6" ein String gebildet, den Du einfach wie ein einzelnes Feld an den bereits erstellten Teil des neuen Datensatzes anhängen kannst.
Mit dem "ReDim" werden die Einträge des "arrFields" für die Behandlung des nächsten eingelesenen Datensatzes dann wieder vorweg gelöscht.
Inwieweit die ganze Struktur sinnvoll ist, musst Du natürlich selbst abschätzen - Tastsache ist jedenfalls, dass jeder der Werte ("Wert_1" etc) nur einmal auftreten darf - mehrfache Vorkommen lassen sich im Ergebnis nicht darstellen. Dies wäre nur möglich, wenn Du im Ergebnis-Datensatz die Häufigkeiten angibst, was dann etwa so aussehen würde:
Grüße
bastla
Sorry - war vorhin leider auf der Flucht und mit einem Bein sowie dem Großteil der grauen Zellen schon aus der Tür ...
Die folgende Variante sollte jetzt aber eher passen:
strDelim = ";"
arrCheck = Array("Wert_1", "Wert_2", "Wert_3", "Wert_4", "Wert_5", "Wert_6", "Wert_7")
M = UBound(arrCheck)
Dim arrFields()
'Do Until objTextFile.AtEndOfStream
'...
'...
'...
Redim arrFields(M)
'Alle für "Variable_6" gefundenen Werte behandeln ...
For Each strEingelesenerWert In Array("Wert_3", "Wert_7", "Wert_9", "Wert_1")
blnFound = False
For i = 0 To M
If strEingelesenerWert = arrCheck(i) Then
arrFields(i) = arrCheck(i)
blnFound = True
Exit For
End If
Next
If Not blnFound Then
MsgBox strEingelesenerWert & " noch nicht vorhanden!", vbCritical
'...
'...
End If
Next
strVariable_6 = Join(arrFields, strDelim)
MsgBox strVariable_6
'...
'...
'Loop
Nachdem alle Werte des aktuellen Datensatzes durchlaufen sind, wird in "strVariable_6" ein String gebildet, den Du einfach wie ein einzelnes Feld an den bereits erstellten Teil des neuen Datensatzes anhängen kannst.
Mit dem "ReDim" werden die Einträge des "arrFields" für die Behandlung des nächsten eingelesenen Datensatzes dann wieder vorweg gelöscht.
Inwieweit die ganze Struktur sinnvoll ist, musst Du natürlich selbst abschätzen - Tastsache ist jedenfalls, dass jeder der Werte ("Wert_1" etc) nur einmal auftreten darf - mehrfache Vorkommen lassen sich im Ergebnis nicht darstellen. Dies wäre nur möglich, wenn Du im Ergebnis-Datensatz die Häufigkeiten angibst, was dann etwa so aussehen würde:
Datensatz | ... | Wert_1 | Wert_2 | ... | Wert_n |
---|---|---|---|---|---|
Datensatz_eins | ... | 0 | 2 | ... | 0 |
Datensatz_zwei | ... | 1 | 1 | ... | 0 |
Datensatz_drei | ... | 0 | 0 | ... | 3 |
Datensatz_vier | ... | 2 | 0 | ... | 1 |
Grüße
bastla
Hallo SeppelCeh!
Für das Löschen wäre eigentlich das "Redim arrFields(M)" zuständig - dieses muss natürlich so platziert sein, dass es vor der Bearbeitung jedes einzelnen Datensatzes (= unmittelbar vor der Schleife für alle "Variable_6"-Werte) ausgeführt wird.
Unelegant wäre die Alternative, in einer eigenen Schleife der Art
die Feldinhalte zu löschen.
Grüße
bastla
Für das Löschen wäre eigentlich das "Redim arrFields(M)" zuständig - dieses muss natürlich so platziert sein, dass es vor der Bearbeitung jedes einzelnen Datensatzes (= unmittelbar vor der Schleife für alle "Variable_6"-Werte) ausgeführt wird.
Unelegant wäre die Alternative, in einer eigenen Schleife der Art
For i = 0 To UBound(arrFields)
arrFields(i) = ""
Next
Grüße
bastla