nick909
Goto Top

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.

<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

Content-Key: 183536

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

Printed on: April 18, 2024 at 23:04 o'clock

Member: rubberman
rubberman Apr 15, 2012 at 11:22:50 (UTC)
Goto Top
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
Mitglied: 76109
76109 Apr 15, 2012 at 13:35:42 (UTC)
Goto Top
Hallo nick909!

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
Member: nick909
nick909 Apr 15, 2012 at 14:23:25 (UTC)
Goto Top
Hallo rubberman,

danke für die Rückmeldung! Du wirst recht haben und es handelt sich wohl tatsächlich um ein XML-Format. Ich habe den Text oben mal der Übersicht halber ersetzt.
Was ich vergessen habe, dass der Eintrag "Archiv xxx" leider auch mal durch Fehleingaben einen Fehler enthalten kann (z.B. Archib oder Archuv). Siehst du hier eine Möglichkeit?

Gruß nick
Member: nick909
nick909 Apr 15, 2012 at 14:30:47 (UTC)
Goto Top
Hallo Dieter,

vielen Dank für deine Unterstützung! Das sieht wirklich schonmal prima aus, aber was mache ich, wenn der Eintrag "Archiv xxx" auch mal falsch geschrieben sein kann (z.B. Archib oder Archuv)? Ich habe den Text oben nochmal angepasst, so lässt sich vielleicht mehr damit anfangen? Natürlich kommen mehr Datensätze hintereinander in der Datei, welche ich übrigens nur per Email bekomme (ursprünglich wohl aus einer alten Oracle-DB als txt rausgelassen). Die gewünschte Auflistung würde mir sehr helfen und Zeit sparen.

Vielen Dank für jegliche Hilfe!

nick
Member: rubberman
rubberman Apr 15, 2012 at 15:27:50 (UTC)
Goto Top
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
.\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
Member: nick909
nick909 Apr 15, 2012 at 16:59:43 (UTC)
Goto Top
Hallo Rubberman,

nun ja, so ganz genau kann ich das leider nicht sagen, vermutlich ist es kein gültiges XML, es handelt sich um ein bestimmtes Übermittlungsverfahren von Analysegeräten. Ich bekomme eine Auflistung der archivierten Daten in dieser Form als txt und würde mir gern zu Verwaltungszwecken diese bestimmten Angaben in eine neue Datei speichern. Diese wiederum z.b. in Excel einlesen. Mir würde es reichen, wenn ich nach ca. 10 fest definierten Zahlen und/oder Wörtern im <bereich1>...</bereich1> mit den zugehörigen Zeilen (Ordner, Schrank, Sachbearbeiter und Raum) im Abschnitt <verwaltungstext>..</verwaltungstext> suchen könnte. Wäre das einfacher zu bewerkstelligen?


Gruß nick


Code Tag korrigiert
Member: rubberman
rubberman Apr 15, 2012 at 19:22:05 (UTC)
Goto Top
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