Top-Themen

Aktuelle Themen (A bis Z)

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Textdatei nach bestimmten Wörtern durchsuchen mit VB oder Batch

Mitglied: nick909

nick909 (Level 1) - Jetzt verbinden

15.04.2012, aktualisiert 19:00 Uhr, 3102 Aufrufe, 7 Kommentare

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.

01.
 
02.
<verwaltung> 
03.
 <vorrangstufe>EINFACH#0</vorrangstufe> 
04.
 <gesendet>12.06.2009 13:05:29</gesendet> 
05.
 <absender><land>ni</land><firma>zentrale</firma></absender> 
06.
 <betreff><![CDATA[Nachrichten Anfang]]></betreff> 
07.
 <empfaenger> 
08.
   <bereich1><land>ni</land><firma>archiv</firma></bereich1> 
09.
   <bereich2></bereich2> 
10.
   <bereich3></bereich3> 
11.
 </empfaenger> 
12.
 <verwaltungtext><![CDATA[Nachrichten Anfang]]></verwaltungtext> 
13.
 <unterschrift><![CDATA[nimhh 13:05:29]]></unterschrift> 
14.
 <anlagen></anlagen> 
15.
 <schlagwoerter></schlagwoerter> 
16.
</verwaltung> 
17.
 
18.
<verwaltung> 
19.
<vorrangstufe>EINFACH#0</vorrangstufe> 
20.
<gesendet>12.06.2009 13:05:32</gesendet> 
21.
<absender><land>ni</land><firma>zentrale</firma></absender> 
22.
<betreff><![CDATA[Ordner  A 38552-09]]></betreff> 
23.
<empfaenger> 
24.
<bereich1> 
25.
<land>ni</land><firma>archiv xxx</firma> 
26.
<land>ni</land><firma>archiv xxxxx</firma> 
27.
</bereich1> 
28.
<bereich2></bereich2> 
29.
<bereich3></bereich3> 
30.
</empfaenger> 
31.
<verwaltungtext><![CDATA[ 
32.
blindtext der nicht wichtig ist!blindtext der nicht wichtig ist! 
33.
 
34.
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist! blindtext der nicht wichtig  
35.
 
36.
ist! blindtext der nicht wichtig ist! 
37.
 
38.
Archiv vom xx.xx.xx blindtext der nicht wichtig ist! blindtext der nicht wichtig ist! 
39.
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!blindtext der nicht wichtig  
40.
 
41.
ist! blindtext der nicht wichtig ist! 
42.
 
43.
Ordner         : A 38552-09 
44.
xxxxxx         : xxxxxxxx 
45.
Sachbearbeiter : Nachname, Vorname 
46.
xxxxxx         : xxxxxxxx 
47.
Schrank-Nr.    : 619056 
48.
xxxxxx         : xxxxxxxx 
49.
 
50.
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist! 
51.
blindtext der nicht wichtig ist! blindtext der nicht wichtig ist!blindtext der nicht wichtig  
52.
 
53.
ist! blindtext der nicht wichtig ist 
54.
 
55.
xxxxxx         : xxxxxxxx 
56.
xxxxxx         : xxxxxxxx 
57.
Raum           : 123 
58.
 
59.
blindtext der nicht wichtig ist! 
60.
 
61.
blindtext der nicht wichtig ist! 
62.
blindtext der nicht wichtig ist! 
63.
blindtext der nicht wichtig ist! 
64.
 
65.
blindtext der nicht wichtig ist! 
66.
 
67.
 
68.
 
69.
blindtext der nicht wichtig ist! 
70.
]]> 
71.
</verwaltungtext> 
72.
<unterschrift><![CDATA[nimhh 3855:2091]]></unterschrift> 
73.
<anlagen></anlagen> 
74.
<schlagwoerter></schlagwoerter> 
75.
</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
Mitglied: rubberman
15.04.2012 um 13:22 Uhr
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: Code Tags machen das Leben leichter und lassen sich auch im Nachgang noch hinzufügen.

Grüße
rubberman
Bitte warten ..
Mitglied: 76109
15.04.2012 um 15:35 Uhr
Hallo nick909!

Versuchs mal damit:
01.
    Option Explicit 
02.
 
03.
    Const FileIn = "C:\Archiv\Archiv.txt" 
04.
    Const FileOut = "C:\Archiv\Sorted.txt" 
05.
 
06.
 
07.
    Dim Fso, File, TextIn, TextOut, Targets, Token, Archiv, Liste, Key, i, t 
08.
     
09.
    Set Fso = CreateObject("Scripting.FileSystemObject") 
10.
     
11.
    Set Liste = CreateObject("Scripting.Dictionary") 
12.
     
13.
    Set File = Fso.OpenTextFile(FileIn) 
14.
     
15.
    TextIn = Split(File.ReadAll, ">Archiv"):   File.Close 
16.
     
17.
    Targets = Array("Ordner", "Schrank", "Sachbearbeiter", "Raum") 
18.
     
19.
    ReDim Token(UBound(Targets)) 
20.
     
21.
    For i = 1 To UBound(TextIn) 
22.
        Archiv = "Archiv" & Split(TextIn(i), "<")(0) 
23.
         
24.
        For t = 0 To UBound(Targets) 
25.
            If InStr(1, TextIn(i), Targets(t), vbTextCompare) > 0 Then 
26.
                Token(t) = Targets(t) & Split(Split(TextIn(i), Targets(t))(1), vbCrLf)(0) 
27.
            Else 
28.
                Token(t) = "nv" 
29.
            End If 
30.
        Next 
31.
         
32.
        With Liste 
33.
            If .Exists(Archiv) Then 
34.
                .Item(Archiv) = .Item(Archiv) & vbCrLf & Join(Token, ";") 
35.
            Else 
36.
                .Add Archiv, Join(Token, ";") 
37.
            End If 
38.
        End With 
39.
    Next 
40.
 
41.
    For Each Key In Liste.Keys 
42.
        TextOut = TextOut & Key & vbCrLf & Liste.Item(Key) & vbCrLf & vbCrLf 
43.
    Next 
44.
     
45.
    Set File = Fso.CreateTextFile(FileOut) 
46.
     
47.
    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
Bitte warten ..
Mitglied: nick909
15.04.2012 um 16:23 Uhr
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
Bitte warten ..
Mitglied: nick909
15.04.2012 um 16:30 Uhr
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
Bitte warten ..
Mitglied: rubberman
15.04.2012 um 17:27 Uhr
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
Bitte warten ..
Mitglied: nick909
15.04.2012 um 18:59 Uhr
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
Bitte warten ..
Mitglied: rubberman
15.04.2012 um 21:22 Uhr
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
Bitte warten ..
Ähnliche Inhalte
Batch & Shell

Batch nach einem exaktem wort in einer textdatei suchen

gelöst Frage von noah1400Batch & Shell4 Kommentare

hallo ich möchte in einem text dokument nach dem wort "ha" suchen wenn in die Textdatei so aussieht 1: ...

Microsoft Office

Excel Spalte nach Wort durchsuchen

gelöst Frage von pcklickMicrosoft Office2 Kommentare

Hallo liebe Admins! Ich habe ein Problem: Und zwar möchte ich eine Excel-Spalte nach einem Wort durchsuchen, bzw. zählen ...

Batch & Shell

Textdatei (.txt) Wort für Wort auslesen per batch (Spaltenweise)

Frage von pdiddoBatch & Shell1 Kommentar

Hi, ich habe eine Textdatei (.txt). Diese hat mehrere Zeilen. Ich möchte diese gerne Spalte für Spalte auslesen, sodass ...

Batch & Shell

Mit Batch einen Ordne mit .txt Dateien nach einem Wort durchsuchen

gelöst Frage von noah1400Batch & Shell8 Kommentare

Hallo Ich möchte eine Art login mit Batch programieren. Als erstes gibt es eine Eingabe dort gibt man seinen ...

Neue Wissensbeiträge
Windows 10

USB Maus und Tastatur versagen Dienst unter Windows 10

Erfahrungsbericht von hardykopff vor 5 StundenWindows 103 Kommentare

Da steht man ziemlich dumm da, wenn der PC sich wegen fehlender USB Tastatur und Maus nicht bedienen lässt. ...

Administrator.de Feedback
Update der Seite: Alles zentriert
Information von Frank vor 8 StundenAdministrator.de Feedback10 Kommentare

Hallo User, die größte Änderung von Release 5.8 ist das Zentrieren der Webseite (auf großen Bildschirmen) und ein "Welcome"-Teaser ...

Humor (lol)

WhatsApp-Nachrichten endlich auch per Bluetooth versendbar

Information von BassFishFox vor 1 TagHumor (lol)4 Kommentare

Genau darauf habe ich gewartet! ;-) Der beliebte Messaging-Dienst WhatsApp erhält eine praktische neue Funktion: Ab dem nächsten Update ...

Google Android

Googles "Android Enterprise Recommended" für Unternehmen

Information von kgborn vor 1 TagGoogle Android3 Kommentare

Hier eine Information, die für Administratoren und Verantwortliche in Unternehmen, die für die Beschaffung und das Rollout von Android-Geräten ...

Heiß diskutierte Inhalte
Server-Hardware
Welche Rolle spielt Design bei Enterprise IT Hardware?
Frage von ApolloXServer-Hardware17 Kommentare

Ich arbeite für einen internationalen Elektronikhersteller in der Forschung und meine Aufgabe ist es, Feedback von Nutzern in Hinsicht ...

Windows Netzwerk
WSUS4 und Windows 10 Updates automatisch installieren
Frage von sammy65Windows Netzwerk15 Kommentare

Hallo miteinander, ich habe mit einen neuen WSUS Server aufgesetzt Server 2016 darauf einen aktuellen WSUS. Grund, wir stellen ...

Speicherkarten
Vergessliche USB-Sticks?
Frage von hanheikSpeicherkarten14 Kommentare

Ich habe in den letzten Tagen 500 USB-Sticks mit Bilddateien bespielt. Obwohl ich die Dateien mit größter Sorgfalt kopiert ...

Switche und Hubs
Cisco SG350X-48 AdminIP in anderes VLAN
Frage von lcer00Switche und Hubs14 Kommentare

Hallo zusammen, ich habe ein Problem mir einem Cisco SG350X-48 bei der Erstinstallation wurde eine IP 192.168.0.254 (Default VLAN ...