Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

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

Frage Entwicklung VB for Applications

Mitglied: nick909

nick909 (Level 1) - Jetzt verbinden

15.04.2012, aktualisiert 19:00 Uhr, 2955 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 ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung! - BNG - Broadband Network Gateway

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Heiß diskutierte Inhalte
Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...

Microsoft Office
Keine Updates für Office 2016 (13)

Frage von Motte990 zum Thema Microsoft Office ...

Grafikkarten & Monitore
Tonprobleme bei Fernseher mit angeschlossenem Laptop über HDMI (11)

Frage von Y3shix zum Thema Grafikkarten & Monitore ...