VB6: Stringvariable parsen

Hallo,
ich möchte mit VB6 eine txt-Datei zeilenweise (bis h0D0A) einlesen.
Jede Zeile entspricht einem Datensatz mit konstanter Länge i und wird in einer Variablen gespeichert.

Die Felder des Datensatzes haben unterschiedliche Länge und sind durch ein Semikolon getrennt.
Jedes Feld soll dabei in eine eigene Variable(i) geschrieben werden.

Die Zeile eines Datensatzes lese ich mit Line Input und speichere sie in einer Datensatzvariablen; das funktioniert.
Aber wie kann ich die Datensatzvariable von Semikolon zu Semikolon zerlegen und in i einzelne Feldvariablen speichern?

vG
der_KPS

Hallo,

ich möchte mit VB6 eine txt-Datei zeilenweise (bis h0D0A)
einlesen.

ist h0D0A die Länge? Warum hexadezimal? Warum nicht 3338?

Jede Zeile entspricht einem Datensatz mit konstanter Länge i
und wird in einer Variablen gespeichert.

Die Felder des Datensatzes haben unterschiedliche Länge und
sind durch ein Semikolon getrennt.

Und die Datensätze durch einen Zeilenumbruch. Richtig? Deshalb LineInput.

Jedes Feld soll dabei in eine eigene Variable(i) geschrieben
werden.

Die Zeile eines Datensatzes lese ich mit Line Input und
speichere sie in einer Datensatzvariablen; das funktioniert.

Ja, ist aber langsam.

Aber wie kann ich die Datensatzvariable von Semikolon zu
Semikolon zerlegen und in i einzelne Feldvariablen speichern?

Ich werfe mal LineInput auch noch raus, das ist mir zu langsam, so etwas möchte ich nicht schreiben. :smile:

Private Sub Lesen()
 Dim Na As String, ff As Integer, i As Integer, Datei As String
 Dim Zeilen() As String, Felder() As String
 ff = FreeFile
 Na = "C:\DeineDatei"
 Datei = Space(FileLen(Na))
 Open Na For Binary As #ff
 Get #ff, , Datei
 Close #ff
 Zeilen = Split(Datei, vbCrLf)
 For i = LBound(Zeilen) To UBound(Zeilen)
 Felder = Split(Zeilen(i), ";")
 ' Achtung !!! Das Array Felder wird bei jeder Zeile
 ' Neu geschrieben, die vorhergehenden Daten gelöscht!
 ' Du hast nicht verraten, wo Du die Daten lassen willst.
 Next
End Sub

Ungetestet, ich hatte keine Daten zur Verfügung. Das sollte aber richtig sein.

Gruß Rainer

Hallo Rainer,

Ungetestet, ich hatte keine Daten zur Verfügung. Das sollte
aber richtig sein.

ja, es ist richtig daß du keine Daten zur Verfügung hattest.

Der code birgt aber die mir neue Funktion „Spilt“. k.A. was damit gemeint sein könnte *grins*

@Anfrager, wenn du, was sehr oft sehr hilfreich ist, Rainer Testdaten zukommen lassen willst, nimm rapidshare, siehe FAQ:2606.
Und Rainer meinte natürlich „Split“

@Rainer, zu dem „nicht testen“, vorhin habe ich jemandem in einem Excelforum ungetestet sowas gebastelt:

if ZeiK \> ZeiA Then
 'Code
Next ZeiK

Naja, wenn man nicht testet passierts halt wie bei dir, wie bei mir.

Gruß
Reinhard

Hallo Reinhard,

Ungetestet, ich hatte keine Daten zur Verfügung. Das sollte
aber richtig sein.

ja, es ist richtig daß du keine Daten zur Verfügung hattest.

Der code birgt aber die mir neue Funktion „Spilt“. k.A. was
damit gemeint sein könnte *grins*

Danke für den Hinweis! Ich habe den MOD gebeten, den Tippfehler zu korrigieren. *gg*

@Anfrager, wenn du, was sehr oft sehr hilfreich ist, Rainer
Testdaten zukommen lassen willst, nimm rapidshare, siehe
FAQ:2606.
Und Rainer meinte natürlich „Split“

@Rainer, zu dem „nicht testen“, vorhin habe ich jemandem in
einem Excelforum ungetestet sowas gebastelt:

if ZeiK > ZeiA Then
'Code
Next ZeiK

Naja, wenn man nicht testet passierts halt wie bei dir, wie
bei mir.

Ja. :smile: Wenn man das Programm nicht startet, fallen Tippfehler nicht auf.

Danke!

Gruß Rainer

Hallo!
Zunächst vielen Dank für den Hinweis auf „Split“.

Ich bis wie vorgeschlegen verfahren, habe die Datei in eine String-Variable mit entspr. Leerstellen eingelesen und aus dieser Datei mit Split (vbCrLf) das eindimensionale dynamische array „zeilen()“ gefüllt.
In einer For-Next-Schleife lese ich die Elemente „zeilen(m)“ aus, teile sie mit Split (";") und beschreibe das eindimensionale dynamische array „felder()“. So weit so gut!
Nun muss ich aber je zeilen(m) auf ein bestimmtes Element in felder(n) zugreifen. Das funktioniert nicht!
So habe ich gedacht, dass ich das dyn. array felder() zweidiemensional anlege; Also felder(m,n).
Für den Zeilenindex m aus o.g. For-Next-Schleife und n dynamisch mit Split aufgefüllt. Also „felder(m)=split(zeilen(m), „;“)“
Leider gibt das eine Fehlermeldung 13 Typenunverträglichkeit.

Wie kann ich das „felder()“ zweidimensional anlegen und beschreiben?

vg
der_kps

Hallo,

So weit so gut!
Nun muss ich aber je zeilen(m) auf ein bestimmtes Element in
felder(n) zugreifen. Das funktioniert nicht!

was heißt: Funktioniert nicht? Wenn n >=0 ist und

Code
Hallo,

ich habe mir mal ein Beispiel gebaut, der Pfad ist jetzt meine Beispieldatei, dafür ist der Code jetzt getestet … und trotzden falsch. :smile: Ich habe den Code jetzt korrigiert.

Option Explicit

Dim Tabelle() As String
Dim c As Integer, r As Integer

Private Sub Command1\_Click()
 Dim i As Integer, j As Integer
 Lesen
 For i = 0 To r
 For j = 0 To c
 Me.Print Tabelle(i, j);
 Next
 Me.Print
 Next
End Sub

Private Sub Lesen()
 Dim Na As String, ff As Integer, i As Integer, Datei As String
 Dim Zeilen() As String, Felder() As String, s As Integer
 ff = FreeFile
 Na = "C:\Test.txt"
 Datei = Space(FileLen(Na))
 Open Na For Binary As #ff
 Get #ff, , Datei
 Close #ff
 Zeilen = Split(Datei, vbCrLf)
 ReDim Tabelle(UBound(Zeilen), 1)
 r = UBound(Zeilen)
 For i = LBound(Zeilen) To UBound(Zeilen)
 Felder = Split(Zeilen(i), ";")
 If UBound(Felder) \> c Then
 c = UBound(Felder)
 ReDim Preserve Tabelle(UBound(Zeilen), c)
 End If
 For s = 0 To UBound(Felder)
 Tabelle(i, s) = Felder(s)
 Next
 Next
End Sub

Gruß Rainer

Hallo,
das ganze Hick-Hack mit
Dim Zeilen() As String, m As Integer
Zeilen = Split(Variable, vbCrLf)

txtBox.text = Zeilen(m) 'Fehler 9

rührt wohl daher, dass ich mich mehrmals bei der Deklaration von Variablen, die mit der Abfrage des arrays zu tun haben, verhauen habe.
Der Fehler 9 war dann irreführen und hatte nichts wirklich mit den Array-Elementen zu tun ;-(
Trotzdem vielen Dank für reichlich Code.

Was halte ich eigentlich von der kostenlosen Microsoft Visual Basic 2008 Express Edition? Welche Einschränkungen hat die Version?
Mit meinem VB6 habe ich vor 7 jahren mal gearbeitet. Das ist ja wohl aus der Mode und verträgt sich nicht so gut mit Vista.

vG
der_kps

Hallo,

das ganze Hick-Hack mit
Dim Zeilen() As String, m As Integer
Zeilen = Split(Variable, vbCrLf)

txtBox.text = Zeilen(m) 'Fehler 9

rührt wohl daher, dass ich mich mehrmals bei der Deklaration
von Variablen, die mit der Abfrage des arrays zu tun haben,
verhauen habe.

OK, kann passieren. :smile:

Der Fehler 9 war dann irreführen und hatte nichts wirklich mit
den Array-Elementen zu tun ;-(
Trotzdem vielen Dank für reichlich Code.

Was halte ich eigentlich von der kostenlosen Microsoft Visual
Basic 2008 Express Edition? Welche Einschränkungen hat die
Version?
Mit meinem VB6 habe ich vor 7 jahren mal gearbeitet. Das ist
ja wohl aus der Mode und verträgt sich nicht so gut mit Vista.

Ja, wenn ich die Kommentare hier richtig interpretiere, funktioniert wohl Shell in allen Varianten auf Vista und Win7 nicht. Was sonst noch alles nicht geht, weiß ich nicht.

VB2008 habe ich mir noch nicht genau genug angesehen. Ich habe in der Firma die Express-Edition installiert, Studio 2008 Enterprise liegt noch unberührt im Schrank. Die Unterschiede zu VB6 sind mir zu groß, was ich brauche geht auch mit VB6. Wo genau die Einschränkung der Express-Version liegt, weiß ich nicht.

Mit VB2008 geht sehr viel einfacher als mit VB. Was ich oft umgesetzt habe, ist die Überwachung von Verzeichnissen auf neue oder geänderte Dateien. Mit VB6 muss man dazu den Timer verwenden und immer lesen. .NET hat dazu ein Steuerelement und löst bei einer Veränderung ein Ereignis aus. Das ist natürlich deutlich besser und eleganter.
Dafür muss man in .NET die in VB6 heiß geliebten Steuerelementefelder umständlich nachempfinden.

Was mich an .NET am meisten nervt ist Folge der modernen und immer wieder gelobten Objekt orientierten Programmierung.

In VB6 tippe ich den Namen eines Steuerelements und dahinter einen Punkt. Die Intellisense zeigt mir dann alle verfügbaren Eigenschaften. Das funktioniert unter .NET so nicht mehr. vergleichbar ist das mit den Verzeichnissen in einem Dateisystem. Die Steuerelemente in VB6 sind vergleichbar mit Laufwerken, auf denen dateien liegen, aber es gibt keine Möglichkeit, Verzeichnisse und Unterverzeichnisse anzulegen. Davon wird die Liste zwar länger, aber man findet immer alle Dateien.
In VB.NET ist das gesuchte dann irgendwo im Baum versteckt und wenn man als Amateur wenig Übung hat, wird die Suche nach einer bestimmten Eigenschaft schon mal langwierig.

VB6 war noch so aufgebaut, daß ein Amateur sich langsam einarbeiten konnte und im laufe der Zeit immer besser werden. Lauffähig war das umständliche Programm aber auch schon. VB.NET scheint mir eher für Leute gedacht, die eine Ausbildung dazu haben.

Gruß Rainer