Textdatei nach bestimmten Wörtern durchsuchen mit VB oder Batch
Hallo,
zunächst begrüße ich dies hilfreiche Forum. Bisher habe ich mir hier immer gute Lösungen oder Lösungsansätze rausziehen können, jetzt musste ich aber selbst eine Frage erstellen, da ich einfach nicht weiter komme. Ich beschäftige mich einfach zu selten mit VB und Batch, obwohl es immer wieder Spaß macht.
Mein Anliegen: Aus folgendem Beispieltext sollen bestimmte Einträge, welche im gleichen Archiv xxx liegen, in eine neue Textdatei (oder csv) geschrieben werden.
Also alle Zeilen (Ordner/Schrank/Sachbearbeiter/Raum) geordnet nach dem Archiv hintereinander (optional mit Semikolon als Trennzeichen) oder untereinander.
usw...
Gewünschtes Ergebnis in einer Textdatei:
Archiv 123
Ordner : A 12345-12;Schrank: C7;Sachbearbeiter: Mustermann1;Raum: 321
Ordner : A 54321-12;Schrank: G6;Sachbearbeiter: Mustermann3;Raum: 876
…
Archiv 234
Ordner : A 23456-12;Schrank: D8;Sachbearbeiter: Mustermann2;Raum: 543
Ordner : A 65432-12; Schrank: F4;Sachbearbeiter: Mustermann4;Raum: 777
…
Archiv 456
…
Oder:
Archiv 123
Ordner : A 12345-12
Schrank: C7
Sachbearbeiter: Mustermann1
Raum: 321
Ordner : A 54321-12
Schrank: G6
Sachbearbeiter: Mustermann3
Raum: 876
Archiv 234
Ordner : A 23456-12
Schrank: D8
Sachbearbeiter: Mustermann2
Raum: 543
Ordner : A 65432-12
Schrank: F4
Sachbearbeiter: Mustermann4
Raum: 777
Archiv 456
…
Ich habe mich mit folgendem Code versucht, weiß aber einfach nicht weiter. Vielleicht doch lieber was als Batch (findstr) ?
Set MyShell=wscript.CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2
strSourceFile = "c:\Archiv\archiv.txt"
strDestFile = "c:\Archiv\sorted.txt"
Set fin = fso.OpenTextFile(strSourceFile, ForReading)
Set fout = fso.OpenTextFile(strDestFile, ForWriting, True)
do while not fin.AtEndOfStream
strInLine = fin.Readline
if instr(strInLine, "Archiv 123") > 0 then
strOutLine = mid(strInLine,30)
end if
if instr(strInLine, "Ordner") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Schrank") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Sachbearbeiter") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Raum") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
fout.writeline strOutLine
end if
Loop
Das Ergebnis geht schon mal so halbwegs in die Richtung, aber irgendwie komme ich als absoluter Laie nicht weiter. Hier sucht er im Loop ja nur nach dem Archiv 123 (und das auch nicht ganz korrekt), wie kann ich dies für die anderen Archive wiederholen? Die Auflistung ist auch nicht richtig. Wäre super wenn mir jemand helfen könnte, ob mit VB oder vielleicht mit einer Batchdatei wäre egal. Die Zeilenanzahl ist übrigens nicht immer gleich, das Archiv steht immer in ><, kann aber in der Länge varieren (z.B. >Archiv 234_a<), die Angaben "Ordner, Schrank, Sachbearbeiter und Raum" stehen immer einzeln in einer Zeile.
Ich hoffe die Angaben sind verständlich, ansonsten bitte Fragen.
Vielen Dank für hilfreiche Beiträge!
Gruß nick909
zunächst begrüße ich dies hilfreiche Forum. Bisher habe ich mir hier immer gute Lösungen oder Lösungsansätze rausziehen können, jetzt musste ich aber selbst eine Frage erstellen, da ich einfach nicht weiter komme. Ich beschäftige mich einfach zu selten mit VB und Batch, obwohl es immer wieder Spaß macht.
Mein Anliegen: Aus folgendem Beispieltext sollen bestimmte Einträge, welche im gleichen Archiv xxx liegen, in eine neue Textdatei (oder csv) geschrieben werden.
Also alle Zeilen (Ordner/Schrank/Sachbearbeiter/Raum) geordnet nach dem Archiv hintereinander (optional mit Semikolon als Trennzeichen) oder untereinander.
<verwaltung>
<vorrangstufe>EINFACH#0</vorrangstufe>
<gesendet>12.06.2009 13:05:29</gesendet>
<absender><land>ni</land><firma>zentrale</firma></absender>
<betreff><![CDATA[Nachrichten Anfang]]></betreff>
<empfaenger>
<bereich1><land>ni</land><firma>archiv</firma></bereich1>
<bereich2></bereich2>
<bereich3></bereich3>
</empfaenger>
<verwaltungtext><![CDATA[Nachrichten Anfang]]></verwaltungtext>
<unterschrift><![CDATA[nimhh 13:05:29]]></unterschrift>
<anlagen></anlagen>
<schlagwoerter></schlagwoerter>
</verwaltung>
<verwaltung>
<vorrangstufe>EINFACH#0</vorrangstufe>
<gesendet>12.06.2009 13:05:32</gesendet>
<absender><land>ni</land><firma>zentrale</firma></absender>
<betreff><![CDATA[Ordner A 38552-09]]></betreff>
<empfaenger>
<bereich1>
<land>ni</land><firma>archiv xxx</firma>
<land>ni</land><firma>archiv xxxxx</firma>
</bereich1>
<bereich2></bereich2>
<bereich3></bereich3>
</empfaenger>
<verwaltungtext><![CDATA[
blindtext der nicht wichtig ist!blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist! blindtext der nicht wichtig
ist! blindtext der nicht wichtig ist!
Archiv vom xx.xx.xx blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!blindtext der nicht wichtig
ist! blindtext der nicht wichtig ist!
Ordner : A 38552-09
xxxxxx : xxxxxxxx
Sachbearbeiter : Nachname, Vorname
xxxxxx : xxxxxxxx
Schrank-Nr. : 619056
xxxxxx : xxxxxxxx
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!blindtext der nicht wichtig
ist! blindtext der nicht wichtig ist
xxxxxx : xxxxxxxx
xxxxxx : xxxxxxxx
Raum : 123
blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist!
blindtext der nicht wichtig ist!
]]>
</verwaltungtext>
<unterschrift><![CDATA[nimhh 3855:2091]]></unterschrift>
<anlagen></anlagen>
<schlagwoerter></schlagwoerter>
</verwaltung>
usw...
Gewünschtes Ergebnis in einer Textdatei:
Archiv 123
Ordner : A 12345-12;Schrank: C7;Sachbearbeiter: Mustermann1;Raum: 321
Ordner : A 54321-12;Schrank: G6;Sachbearbeiter: Mustermann3;Raum: 876
…
Archiv 234
Ordner : A 23456-12;Schrank: D8;Sachbearbeiter: Mustermann2;Raum: 543
Ordner : A 65432-12; Schrank: F4;Sachbearbeiter: Mustermann4;Raum: 777
…
Archiv 456
…
Oder:
Archiv 123
Ordner : A 12345-12
Schrank: C7
Sachbearbeiter: Mustermann1
Raum: 321
Ordner : A 54321-12
Schrank: G6
Sachbearbeiter: Mustermann3
Raum: 876
Archiv 234
Ordner : A 23456-12
Schrank: D8
Sachbearbeiter: Mustermann2
Raum: 543
Ordner : A 65432-12
Schrank: F4
Sachbearbeiter: Mustermann4
Raum: 777
Archiv 456
…
Ich habe mich mit folgendem Code versucht, weiß aber einfach nicht weiter. Vielleicht doch lieber was als Batch (findstr) ?
Set MyShell=wscript.CreateObject("Wscript.Shell")
Set fso = CreateObject("Scripting.FileSystemObject")
Const ForReading = 1, ForWriting = 2
strSourceFile = "c:\Archiv\archiv.txt"
strDestFile = "c:\Archiv\sorted.txt"
Set fin = fso.OpenTextFile(strSourceFile, ForReading)
Set fout = fso.OpenTextFile(strDestFile, ForWriting, True)
do while not fin.AtEndOfStream
strInLine = fin.Readline
if instr(strInLine, "Archiv 123") > 0 then
strOutLine = mid(strInLine,30)
end if
if instr(strInLine, "Ordner") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Schrank") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Sachbearbeiter") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
end if
if instr(strInLine, "Raum") > 0 then
strOutLine = strOutLine & " " & mid(strInLine,1)
fout.writeline strOutLine
end if
Loop
Das Ergebnis geht schon mal so halbwegs in die Richtung, aber irgendwie komme ich als absoluter Laie nicht weiter. Hier sucht er im Loop ja nur nach dem Archiv 123 (und das auch nicht ganz korrekt), wie kann ich dies für die anderen Archive wiederholen? Die Auflistung ist auch nicht richtig. Wäre super wenn mir jemand helfen könnte, ob mit VB oder vielleicht mit einer Batchdatei wäre egal. Die Zeilenanzahl ist übrigens nicht immer gleich, das Archiv steht immer in ><, kann aber in der Länge varieren (z.B. >Archiv 234_a<), die Angaben "Ordner, Schrank, Sachbearbeiter und Raum" stehen immer einzeln in einer Zeile.
Ich hoffe die Angaben sind verständlich, ansonsten bitte Fragen.
Vielen Dank für hilfreiche Beiträge!
Gruß nick909
Please also mark the comments that contributed to the solution of the article
Content-ID: 183536
Url: https://administrator.de/forum/textdatei-nach-bestimmten-woertern-durchsuchen-mit-vb-oder-batch-183536.html
Printed on: May 13, 2025 at 06:05 o'clock
7 Comments
Latest comment
Hallo nick909, willkommen im Forum.
Womit genau hast du es denn mit den Archivdateien tatsächlich zu tun? Zeichen wie < und > deuten irgendwie auf HTML oder XML Formate.
Wenn es XML ist, gibt es mit XML DOM in einem VBScript eine recht gute Möglichkeit die Daten zu extrahieren. Auch reguläre Ausdrücke könnten zur Anwendung kommen. Dazu ist die von dir gepostete Struktur allerdings zu unklar.
BTW: machen das Leben leichter und lassen sich auch im Nachgang noch hinzufügen.
Grüße
rubberman
Womit genau hast du es denn mit den Archivdateien tatsächlich zu tun? Zeichen wie < und > deuten irgendwie auf HTML oder XML Formate.
Wenn es XML ist, gibt es mit XML DOM in einem VBScript eine recht gute Möglichkeit die Daten zu extrahieren. Auch reguläre Ausdrücke könnten zur Anwendung kommen. Dazu ist die von dir gepostete Struktur allerdings zu unklar.
BTW: machen das Leben leichter und lassen sich auch im Nachgang noch hinzufügen.
Grüße
rubberman

Hallo nick909!
Versuchs mal damit:
Ausgabe mit Deinem Beispiel:
Gruß Dieter
Versuchs mal damit:
Option Explicit
Const FileIn = "C:\Archiv\Archiv.txt"
Const FileOut = "C:\Archiv\Sorted.txt"
Dim Fso, File, TextIn, TextOut, Targets, Token, Archiv, Liste, Key, i, t
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Liste = CreateObject("Scripting.Dictionary")
Set File = Fso.OpenTextFile(FileIn)
TextIn = Split(File.ReadAll, ">Archiv"): File.Close
Targets = Array("Ordner", "Schrank", "Sachbearbeiter", "Raum")
ReDim Token(UBound(Targets))
For i = 1 To UBound(TextIn)
Archiv = "Archiv" & Split(TextIn(i), "<")(0)
For t = 0 To UBound(Targets)
If InStr(1, TextIn(i), Targets(t), vbTextCompare) > 0 Then
Token(t) = Targets(t) & Split(Split(TextIn(i), Targets(t))(1), vbCrLf)(0)
Else
Token(t) = "nv"
End If
Next
With Liste
If .Exists(Archiv) Then
.Item(Archiv) = .Item(Archiv) & vbCrLf & Join(Token, ";")
Else
.Add Archiv, Join(Token, ";")
End If
End With
Next
For Each Key In Liste.Keys
TextOut = TextOut & Key & vbCrLf & Liste.Item(Key) & vbCrLf & vbCrLf
Next
Set File = Fso.CreateTextFile(FileOut)
File.Write TextOut: File.Close
Ausgabe mit Deinem Beispiel:
Archiv 123
Ordner : A 12345-12;Schrank: C7;Sachbearbeiter: Mustermann1;Raum: 321
Ordner : A 54321-12;Schrank: G6;Sachbearbeiter: Mustermann3;Raum: 876
Archiv 234_a
Ordner : A 23456-12;Schrank: D8;Sachbearbeiter: Mustermann2;Raum: 543
Ordner : A 65432-12;Schrank: F4;Sachbearbeiter: Mustermann4;Raum: 777
Archiv 456
nv;nv;nv;nv
Gruß Dieter
Hallo nick909,
man müsste schon etwas in die Trickkiste greifen. Wenn es sich um XML Text handelt, könnte man Schreibfehler schon abfangen, da sich ein Pfad zum richtigen Knoten definieren lässt, á la
Dazu muss es sich aber um ein gültiges XML format handel. Das kann ich leider immer noch nicht erkennen. So darf es bspw. nur EIN Wurzelelement geben. In deinem Beispiel oben kommt 2x das Element verwaltung vor. Kannst du noch mal konkretisieren?!
BTW: Das schließende Code Tag mit / statt \, dann wird es richtig angezeigt.
Grüße
rubberman
man müsste schon etwas in die Trickkiste greifen. Wenn es sich um XML Text handelt, könnte man Schreibfehler schon abfangen, da sich ein Pfad zum richtigen Knoten definieren lässt, á la
.\verwaltung\empfaenger\bereich1\firma
Dazu muss es sich aber um ein gültiges XML format handel. Das kann ich leider immer noch nicht erkennen. So darf es bspw. nur EIN Wurzelelement geben. In deinem Beispiel oben kommt 2x das Element verwaltung vor. Kannst du noch mal konkretisieren?!
BTW: Das schließende Code Tag mit / statt \, dann wird es richtig angezeigt.
Grüße
rubberman
Hallo nick909,
funktioniert nur mit gültien XML Dateien, da man den Text in ein DOM Objekt laden muss. Natürlich könnte man den Inhat erweitern, dass es gültigen XML Text ergibt. Alles in allem ist die Erstellung eines funktionierenden Codes nicht so einfach, wenn man nicht konkret eine solche Quelldatei vorliegen hat. Neben dem genauen Format, muss auch die korrekte Zeichenkodierung beachtet werden etc. Der CDATA Abschnitt kann dann zwar auch separiert werden, muss danach aber ohnehin mit Mitteln wie RegEx nachbearbeitet werden.
Mit 50 Zeilen Code ist das nicht getan und, wie gesagt, ohne konkretes Beispiel leider auch nicht.
Grüße
rubberman
funktioniert nur mit gültien XML Dateien, da man den Text in ein DOM Objekt laden muss. Natürlich könnte man den Inhat erweitern, dass es gültigen XML Text ergibt. Alles in allem ist die Erstellung eines funktionierenden Codes nicht so einfach, wenn man nicht konkret eine solche Quelldatei vorliegen hat. Neben dem genauen Format, muss auch die korrekte Zeichenkodierung beachtet werden etc. Der CDATA Abschnitt kann dann zwar auch separiert werden, muss danach aber ohnehin mit Mitteln wie RegEx nachbearbeitet werden.
Mit 50 Zeilen Code ist das nicht getan und, wie gesagt, ohne konkretes Beispiel leider auch nicht.
Grüße
rubberman