# In Textdateien Springen



## Fr3dd1 (25. Dezember 2006)

Hallo,

zu meiner Frage habe ich bei der Suche nichts gefunden.
Ich hab 2 Probleme.

1. Ich möchte in einer Textdatei in eine bestimmte Zeile springen, und von dort aus sollen die nächsten 7 Zeilen ausgelesen werden und in bestimmten Variablen gespeichert werden.

Bsp.

Andre
Wohnort
Geburtsort
...

2. Ich möchte Jede Zeile aus einer textdatei auslesen. Ich weis nicht wie viele Zeilen die textdatei hat. Jede Zeile soll einen Wert zugeordnet bekommen. Die erste Zeile 1 die zweite Zeile 2 usw. Damit ich die einzelnen Zeilen über die Nummerirung auswählen kann.

Wenn mir wer helfen könnte, wäre nett!

mfg Freddy


----------



## maniacquaker (25. Dezember 2006)

guck mal nach den dateioperationen (fopen,fread,fgets...).

damit kannst du dann die datei in einen string einlesen. ein zeilenende ist glaube ich
ein '\n'. die siebte zeile wäre also wenn man 6 mal auf ein '\n' gestoßen ist.
(es gibt aber auch funktionen, die jeweils nur eine zeile einlesen)

wenn du die zahlen nummer nummerieren willst dann tu das doch einmal mit einem 2-dimensionalen array. zb. char zeilen[129][129] .

dann fängst du erst an bei zeile[1] hineinzuschreiben, dann hast du deine nummerierung.

so funktioniert das natürlich nur, wenn du weisst, dass du niemals 2000 zeilen bearbeiten musst. in diesem fall schau mal nach verketteten listen.

bin zwar kein sehr guter programmierer aber so sollte es zu realisieren sein.


----------



## Fr3dd1 (25. Dezember 2006)

kannst du das genauer erklären wie das genau geht?


----------



## DrSoong (25. Dezember 2006)

@maniacquaker: Wir sind im VB-Forum, dein Rat scheint eher in Richtung PHP zu gehen.

@Fr3dd1: Lies die ganze Textdatei ein und splitte sie. Dann kannst du im Array jede Zeile auswählen:

```
Dim fFile As Integer, fInhalt As String, vZeilen As String, DateiName As String
fFile = FreeFile
DateiName = "C:\Test.txt" 'hier dein Name inkl. Pfad
fInhalt = Space(FileLen(DateiName)) 'Variable in der richtigen Länge vorfüllen
Open DateiName For Binary As fFile
 Get fFile, , fInhalt 'komplette Datei einlesen
Close fFile
vZeilen = Split(fInhalt, vbNewLine) 'den Text in Zeilen teilen
'vZeilen ist ein Array, dass sämtliche Zeilen enthält. Die Größe ist
AnzahlZeilen = UBound(vZeilen) + 1
'da das Array bei 0 beginnt hat die erste Zeile den Index 0
ErsteZeile = vZeilen(0)
```
So kannst du dann ganz einfach die Zeilen ansprechen und damit arbeiten.


Der Doc!


----------



## Fr3dd1 (25. Dezember 2006)

hab deinen code mal eingefügt. Der spuckt dann als Fehler aus: Compile error Expected array und zeigt auf UBound


----------



## DrSoong (25. Dezember 2006)

Ups, Fehler in der Deklaration, Zeile sollte so lauten:

```
Dim fFile As Integer, fInhalt As String, vZeilen() As String, DateiName As String
```

Ist alles aus dem Kopf und ohne Überprüfung, daher können sich schon mal Fehler einschleichen. Sollte aber so funktionieren.


Der Doc!


----------



## Fr3dd1 (26. Dezember 2006)

Danke so funktioniert das nun erst einmal. Kann man denn auch die Zeilen in die die textdatei gesplitet worden ist zählen?

Und dann noch eine Frage, kann ich in eine Zeile mehrere Werte schreiben die dann vom Programm getrennt werde?

Bsp.:
Name; Wohnort; Straße

Wie kann ich die einzelnen Wörter abfragen?
mfg Freddy


----------



## DrSoong (26. Dezember 2006)

Die Anzahl der Werte eines Arrays ermittelst du mit

```
Anzahl = UBound(Array) + 1
```
(+1 da das Array ja mit 0 zu zählen beginnt). Das hatte ich ja aber auch schon im vorigen Code (Variable *AnzahlZeilen*).

Wenn du einen einzelnen String so trennen willst, benutz wie im großen Beispiel die Funktion *Split()*. In deinem Fall wäre das Trennzeichen halt z.B. der Strichpunkt, könnte so aussehen:

```
Text = "Name; Wohnort; Straße"
Textteile = Split(Text, ";")
'Jetzt würde dein Array folgend aussehen:
'Textteile(0) = "Name"
'Textteile(1) = " Wohnort"
'Textteile(2) = " Straße"
'Beachte die führenden Leerzeichen bei Wohnort und Straße, mit LTrim() kannst du die entfernen
```


Der Doc!


----------



## Fr3dd1 (26. Dezember 2006)

so ich hab das jetztb einigermaßen hinbekommen. Ich hab nur noch eine Frage. Ich hab eine Textdatei wo ich die ganzen werte Rauslese. Jetzt wollte ich da Kommentare beischreiben. Kann ich das machen ohne das die ausgelesen werden?

mfg Freddy


----------



## DrSoong (26. Dezember 2006)

Nachdem die Kommentare in der Textdate stehen, werden sie auch mit ausgelesen. Das kannst du nicht verhindern, sehrwohl aber, dass sie mit angezeigt werden.

```
'Zusätzlich eine Variable dimensionieren:
Dim vKommentar() As String
'Annahme: Du hast jetzt schon die Testdatei ausgelesen und die Zeilen stehen in vZeilen()
'Als Trennzeichen kannst du z.b. "///" (drei Slashes) nehmen

Anzahl = UBound(vZeilen())
ReDim vKommentar(Anzahl)
For cnt = 0 To Anzahl
 cPos = InStr(vZeilen(cnt), "///")
 If cPos > 0 Then
  vKommentar(cnt) = Right(vZeilen(cnt), Len(vZeilen(cnt) - cPos + 1) '+1 damit er auch das erste Trennzeichen mitnimmt. Ansonsten ersetz es durch -2
  vZeilen(cnt) = Left(vZeilen(cnt), cPos - 1)
 End If
Next cnt
```
Jetzt würde der reine Text im Array *vZeilen*, der Kommentar (inkl. der Trennzeichen) in *vKommentar* stehen. Wenn du das ganze speichern willst, musst dur nur erst die beiden Arrays wieder Zeile für Zeile verbinden.


Der Doc!


----------



## Fr3dd1 (26. Dezember 2006)

ok danke, nun hab ich ersteinmal alles was ich brauche. Wenn ich noch fragen haben sollte, frag ich hier nochmal nach.

EDIT: Also ich hab da noch ein Problem. Ich hab das soweit alles hinbekommen. Ich splite einen text erst in Zeilen, und dann die zeile die ich brauche in Wörter und nehme mir dann das raus was ich brauche. Nun hab ich aber das problem das eine die Informnationen aus einer Zeile irgendwie nicht ausgelesen werden. Ich hab den Code einmal geschrieben und dann kopiert. Bei allen anderen Zeilen funktioniert dieser code. Nur die besagte Zeile tauscht nirgendwo auf. Ich guck da noch mal drüber obn ich was in der Syntax falsch gemacht abe, aber das kann eig nicht. Wenn ich nicht weiterkomme poste ich den Code mal.

mfg Freddy
big THX


----------



## Fr3dd1 (27. Dezember 2006)

So jetzt hab ich ein Problem. Ich bestimme über eine Variable (Lis) welche zeile angepeilt werden soll. Vorher splite ich die TXT Datei in Zeilen. Die Zeile die ich dann ausgewählt habe, splite ich dann ein zweites mal, in Wörter. Nun hab ich das Problem das der bei 2 Punkten nicht die Zeile nimmt die ich will sondern die erste zeile. Was kann ich falsch gemacht haben? <---- Hat sich erledigt, ich hatte eine Leerstelle bei der if anweisung zuviel...

Und dann wollte ich noch wissen wie man eine Textdatei, jeweils das erste Wort einer zeile, nach einem Wort durchsuchen kann? Ich möchte dann den Wert nach dem Wort, eine Zahl, in einer Variable speichern und damit weiterarbeiten.

mfg Freddy


----------



## DrSoong (27. Dezember 2006)

Am besten, du liest die Datei ganz ein, splittest sie aber nicht. Dann durchsuchst du die ganze Datei mittels InStr() nach deinem Schlüsselwort mit einem vorhergesetzten Zeilenwechsel (siehe den ua Code). Dann einfach den dem Zeichen suchen, das hinter der Zahl stehn (Leerzeichen, Zeilenwechsel, ...) und schon hast du die Zahl. Ein kleiner Beispielcode:

```
Dim fFile%, vInhalt$, vStelle%, vTStelle%, vZahl&
 fFile = FreeFile
 vInhalt = Space(FileLen("C:\test.txt"))
 Open "C:\test.txt" For Binary As fFile
  Get fFile, , vInhalt
 Close fFile
  vStelle = InStr(vInhalt, vbNewLine & "Wort") 'Suche nach dem Wort mit einem vorangestellten Zeilenumbruch (erste Zeile muss separat durchsucht werden)
  If vStelle > 0 Then 'Wenn ja
   vTStelle = vStelle + 6 'Erste Stelle nach dem Wort festlegen (Länge Wort + 2 Zeichen Zeilenumbruch; ev noch das Trennzeichen beachten
   vStelle = InStr(vTStelle, vInhalt, vbNewLine) 'Zeichen nach der Zahl suchen (hier Zeilenumbruch)
   vZahl = clng(val(Mid(vInhalt, vTStelle, vStelle - vTStelle))) 'und die Zahl isolieren
  End If
  MsgBox vZahl 'Ich geb sie hier einfach mal per MessageBox aus
```

Code ist nur Anschauung, du musst ihn natürlich für deine Datei anpassen.


Der Doc!


----------

