host-ess
Goto Top

VbScript: Textdatei nach Suchbegriff nur die nächsten drei Zeilen ausgeben

Moin, Moin,
ich bin neu hier im Forum und auch Neuling was Vbscript betrifft.
Vielleicht kann mir ja jemand helfen?
Folgendes Problem, in einer Textdatei stehen an unterschiedlichen
Positionen die Suchbegriffe Vorname: Nachname: Geb.-Datum: und
Geburts-Ort:
Dummerweise stehen die gesuchten Inhalte nicht hinter dem Suchbegriff,
sondern in den folgenden drei Zeilen (incl. Leerzeilen), sieht wie folgt aus:

Text-Text-Text-Text-Text-Text
Text-Text-Text-Text-Text-Text
Vorname:
(Leerzeile)
Max (Inhalt soll ausgelesen werden)
(Leerzeile)
Text-Text-Text-Text-Text-Text
Nachname:
(Leerzeile)
Muster (Inhalt soll ausgelesen werden)
(Leerzeile)
Text-Text-Text-Text-Text-Text
Text-Text-Text-Text-Text-Text
Text-Text-Text-Text-Text-Text
Geb.-Datum:
u.s.w.
Ich beiße mir seit Tagen die Zähne aus und komme nicht weiter!
Wenn möglich ein Lösungsansatz ohne REG EX, da sonst die
Verwirrung complete;(

freundliche Grüße an alle die es lesen
Host-ess

Content-Key: 354408

Url: https://administrator.de/contentid/354408

Printed on: April 25, 2024 at 06:04 o'clock

Member: emeriks
emeriks Nov 10, 2017 at 11:09:00 (UTC)
Goto Top
Hi,
es wäre hilfreich, wenn Du uns das Stück Code mit Deinen Zähnen drin face-wink hier mal vorstellen würdest.

Ansonsten in etwa so:
  Dim FSO
  Set FSO = CreateObject("Scripting.FileSystemObject")  

  Dim Line
  Dim Vorname, Nachname, GebDatum
  With FSO.OpenTextFile("Pfad_zur_Datei")  
     While Not .EndOfStream
        Line = .ReadLine
        If Left(Line, 8 ) = "Vorname:" Then  
            .ReadLine   'Leerzeile überspringen  
            Vorname = Trim(.ReadLine)
        ElseIf Left(Line, 9 ) = "Nachname:" Then  
            .ReadLine   'Leerzeile überspringen  
            Nachname = Trim(.ReadLine)
        ElseIf Left(Line, 10 ) = "Geb.-Datum:" Then  
            .ReadLine   'Leerzeile überspringen  
            GebDatum = Trim(.ReadLine)
        End If
     Wend
  End With

E.
Member: Host-ess
Host-ess Nov 11, 2017 at 06:17:56 (UTC)
Goto Top
Moin, Moin,
SUPER - das klappt ja hervorragend und so schnell, vielen Dank!
Nach erfolgreichem Test, konnte ich 90% meines
Problems abdecken, habe im Text öfter den Suchbegriff
Geburts-Ort: ohne Inhalt sieht wie folgt aus:

Geburts-Ort:
01.01.1992 (Inhalt soll ausgelesen werden)

Land:

Geburts-Ort: (ohne Inhalt)
Geburts-Ort: (ohne Inhalt)
Geburts-Ort: (ohne Inhalt)

Deshalb noch eine Anschlussfrage, kann ich zwischen
zwei unterschiedlichen Suchbegriffen auslesen, in meinem
Fall zwischen Geburts-Ort: und Land: ?

freundliche Grüße aus dem Norden
Host-ess
Member: emeriks
emeriks Nov 11, 2017 at 13:01:21 (UTC)
Goto Top
Deshalb noch eine Anschlussfrage, kann ich zwischen
zwei unterschiedlichen Suchbegriffen auslesen, in meinem
Fall zwischen Geburts-Ort: und Land: ?
"kann ich zwischen zwei unterschiedlichen Suchbegriffen auslesen"
Diese Frage ist unverständlich bzw. sicher nicht das, was Du fragen willst.
So gefragt kann ich bloß antworten: Ja , Du kannst. Aber das wird Dir nicht helfen.
Member: Host-ess
Host-ess Nov 12, 2017 at 07:21:50 (UTC)
Goto Top
Moin, Moin emeriks,

nochmal vielen Dank für den guten Tipp!
Ich hatte das Muster-Beispiel noch ein wenig
abgeändert und es lief sofort. Deshalb
dann erneut die Frage, hast Du noch so eine
Top-Idee parat? Ich würde meinen Code gerne
auch einmal posten, habe aber noch nicht
heraus, wie das im "Edit-Modus(dann mit Zeilenangabe)"
funktioniert. Z.Zt. würde es dann nur wie mein Suchtext
Beispiel aussehen!

Grüße aus dem hohen Norden
Host-ess
Member: emeriks
emeriks Nov 12, 2017 at 10:44:16 (UTC)
Goto Top
siehe hier:

hast Du noch so eine Top-Idee parat?
Und deshalb erneut meine Frage: Idee wofür? Ich kann nicht hellsehen und Deine Frage war nicht klar formuliert.
Member: Host-ess
Host-ess Nov 12, 2017 at 11:21:27 (UTC)
Goto Top
ok. ich versuche es nochmal zu formulieren.
In meiner Textdatei taucht öfter der Suchbegriff
Geburts-Ort auf, mal mit Inhalt in der zweiten Zeile
und häufiger ohne Inhalt in der zweiten Zeile. Die Zeilen ohne
Inhalt erscheinen aber trotzdem in meiner Ergebnis-Liste und
stören. Um das zu ändern würde ich gerne einen zweiten
Suchbegriff, in meinem Fall "Land", einbauen. Nach allen
Zeilen mit Inhalt erscheint auf jeden Fall der Begriff "Land"
(zwei Zeilen danach).
Hier nochmal ein Text-Beispiel:
Geburt-Ort:
(Leerzeile)
Flensburg (Inhalt wird ausgelesen)
(Leerzeile)
Land:

die Zeilen, die nichtbenötigt werden, erscheinen im Ergebnis
und sehen so aus:
Geburt-Ort:
(Leerzeile)
(Leerzeile)
Geburt-Ort:
(Leerzeile)
(Leerzeile)
Geburt-Ort:
(Leerzeile)
(Leerzeile) usw.

Ich hoffe es ist jetzt verständlicher und hier noch meine Code. Was auskommentiert
ist funktioniert noch nicht!

 
Const ForReading = 1, ForWriting = 2
Dim FSO, FileIn, FileOut
Dim Line
Dim Vorname, Nachname, GebDatum, GebOrt, Land

Set FSO     = CreateObject("Scripting.FileSystemObject")  
Set FileIn  = FSO.OpenTextFile("adr.txt", ForReading)  
Set FileOut = FSO.OpenTextFile("adrneu.txt", ForWriting, True)  

Do Until FileIn.AtEndOfStream
    Line = FileIn.ReadLine
        If Left(Line, 8 ) = "Vorname:" Then  
            FileIn.ReadLine   'Leerzeile überspringen  
            Vorname = Trim(FileIn.ReadLine)
FileOut.WriteLine Vorname
  ElseIf Left(Line, 9 ) = "Nachname:" Then  
            FileIn.ReadLine   'Leerzeile überspringen  
            Nachname = Trim(FileIn.ReadLine)
FileOut.WriteLine Nachname
  ElseIf Left(Line, 11 ) = "Geb.-Datum:" Then  
            FileIn.ReadLine   'Leerzeile überspringen  
            GebDatum = Trim(FileIn.ReadLine)
 FileOut.WriteLine GebDatum
        ElseIf Left(Line, 12 ) = "Geburts-Ort:" Then                                  'an dieser Stelle 2.ter Suchbegriff Land    
       ' ElseIf Left(Line, 12 ) = "Geburts-Ort:" And Left(Line, 5 ) = "Land:" Then    'So habe ich gedacht, funktioniert nicht!  
       FileIn.ReadLine   'Leerzeile überspringen  
            GebOrt = Trim(FileIn.ReadLine)
           ' GebOrt & Land = Trim(FileIn.ReadLine)                                    'So habe ich gedacht, funktioniert nicht!   
FileOut.WriteLine GebOrt
  End If
Loop
FileIn.Close
FileOut.Close
MsgBox "Fertig"   
Member: emeriks
emeriks Nov 12, 2017 at 11:34:35 (UTC)
Goto Top
Einfach eine zusätzliche Prüfung auf Leerzeile einbauen?

    ...
    ElseIf Left(Line, 11 ) = "Geb.-Datum:" Then  
      FileIn.ReadLine   'Leerzeile überspringen  
      Test =  = Trim(FileIn.ReadLine)
      'Wert nur dann als GebDatum übenehmen, wenn er nicht leer ist.  
      If Test <> "" then  
        GebDatum = Test
      end if
    ...
Member: Host-ess
Host-ess Nov 12, 2017 at 18:24:11 (UTC)
Goto Top
Code getestet, leider keine Verbesserung, da die Leerzeilen
nach Geburtsort immer wieder variieren. Es bleibt wohl nur
die Möglichkeit die Zeilen zwischen den o.g. beiden Suchbegriffen
auszulesen. face-sad
Wenn möglich so in der Art:
 
....
 ElseIf Left(Line, 12 ) = "Geburts-Ort:" And Left(Line, 5 ) = "Land:" Then      
       FileIn.ReadLine   'Leerzeile überspringen  
         GebOrt & Land = Trim(FileIn.ReadLine)                                     
FileOut.WriteLine GebOrt
....
Member: emeriks
emeriks Nov 12, 2017 updated at 18:58:49 (UTC)
Goto Top
da die Leerzeilen nach Geburtsort immer wieder variieren.
Wie jetzt? Rote, blaue und grüne Leerzeilen, oder was?
Oder etwa die Anzahl der Leerzeilen?
Wenn Du es nicht packst, eine Frage korrekt auszuformulieren, dann wird das bei Dir nie was mit dem Programmieren!
   ElseIf Left(Line, 12 ) = "Geburts-Ort:" And Left(Line, 5 ) = "Land:" Then      
Wieviel Wörter kennst Du, welche gleichzeitig sowohl mit "Geburts-Ort" als auch "Land:" anfangen?
Wenn, dann kannst Du hier nur "oder" gemeint haben.
   GebOrt & Land = Trim(FileIn.ReadLine)                                     
"&" ist ein Operator zum Verketten von Strings.
"And" ein logischer Operator.
Beide sind nicht geeignet, um auszudrücken: A und B ergeben sich aus C. Hier muss man explizit sagen: A ergibt sich aus C. Und: B ergibt sich aus C.

Können da je Datei mehrere Datensätze stehen oder je Datei immer nur genau einer?
Egal wie:
Vor jedem Durchlauf (nächste Datei oder nächster Datensatz pro Datei) die Variablen auf einen definierten Start-Wert stellen. Also Leerstring, 0 oder Nothing.
Also in etwa:
   'Start-Werte  
   Vorname = ""  
   Nachname = ""  
   GebDatum = ""  
   GebOrt = ""  
   Land = ""  
  ....
 'Wenn Zeile mit "Geburts-Ort" beginnt und wir noch keinen Geburtsort eingelesen haben (GebOrt = "")  
 ElseIf Left(Line, 12 ) = "Geburts-Ort:" And  GebOrt = "" Then      
       FileIn.ReadLine   'Leerzeile überspringen  
       GebOrt = Trim(FileIn.ReadLine)                                     
       FileOut.WriteLine GebOrt
 'Wenn Zeile mit "Land" beginnt und wir noch kein Land eingelesen haben (Land = "")  
 ElseIf Left(Line,5 ) = "Land:" And Land = "" Then      
       FileIn.ReadLine   'Leerzeile überspringen  
       Land = Trim(FileIn.ReadLine)                                     
       FileOut.WriteLine GebOrt
....
Member: Host-ess
Host-ess Nov 13, 2017 at 18:23:27 (UTC)
Goto Top
Heut mal guten Abend,
vielen, vielen Dank für die Engelsgeduld und der klaren Worte - so klappt es!

Es sind noch nicht die angestrebten 100%, da die Textvorgabe mit
variierten Leerzeilen wirklich besch.... ist. Sollte aber Dank Deiner
Schützenhilfe kein Problem mehr sein.
Ich "close" die Anfrage in zwei Tagen.

Grüße von der Küste

Host-ess/Michael