akrupp2
Goto Top

String in Dateien suchen und in andere Datei schreiben, wenn gefunden.

Hallo,
nach elend langer tüftelei komme ich einfach nicht weiter und hoffe, dass mir hier jemand einen Lösungsansatz geben kann.

Folgendes Problem:

Ich verwalte und pflege auf der Arbeit das Korrespondenz-System. Jede Korrespondenzvorlage ist im System als XML-Datei abgelegt und enthält einige Datenfelder. Diese Datenfelder, will ich raussuchen und in eine Logdatei schreiben. Ziel ist es rauszufinden in welcher Vorlage, welche Datenfelder vorkommen.

Jetzt gibt es dabei aber folgende Probleme:

1. Die XML-Datei die durchsucht werden soll besteht (wenn man sie im Editor öffnet) aus nur einer Zeile, so dass mir ein zeilenweises auslesen nicht wirklich was bringt.

2. Der Suchstring kann in dieser Zeile mehrmals vorkommen

3. Jeder gefundene String soll dann in eine Logfile geschrieben werden. Allerdings nicht nur der String selbst, weil der Suchstring nur ein Teil des Datenfeldes ist, welches in die Logdatei geschrieben werden soll.

So nun nochmal etwas konkreter:

Eine XML-Datei sieht wie folgt aus:

<?xml_version="1.0"?><!--generated by Thunderhead.Content, Version=3.0.12.0, Culture=neutral, PublicKeyToken=84c666f5e68a8973--><docdef version="3.0" bo-name="Human_Resources" bo-class="Th_180000251*_Human_Resources" styleset="190000626"><script language="JavaScript" /><channel channel="2" template="190000624"><sectionmap section="Letter Block" region="Letter Body" /><sectionmap section="Page Number" region="Page Number" /><sectionmap section="Letter Footer" region="Footer" /><sectionmap section="DB Logo" region="Company Logo" /><sectionmap section="Adressblock Customer" region="Address Customer" /><sectionmap section="Adress DB" region="Address DB" /><setproperty name="display-width"><string>210mm</string></setproperty></channel><section id="2" name="Document" edit-groups="*"><section id="57" name="DB Logo"><fraglink id="73" resid="190000861"><argvalue name="Unternehmen"><var name="Human_Resources.db_people_Datenfelder.Absenderinformationen.Unternehmen" type="string" /></argvalue><argvalue name="Region"><var name="Human_Resources.db_people_Datenfelder.Absenderinformationen.Region" type="string" /></argvalue></fraglink></section><section id="22" name="Adressblock Customer" edit-groups="*"><fraglink id="75" resid="190000128"><argvalue name="Anrede__Herrn_Frau"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Anrede__Herrn_Frau</script></argvalue><argvalue name="Vollstaendiger_Name_mit_Vorsatz_Zusatz_Titel"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Vollstaendiger_Name_mit_Vorsatz_Zusatz_Titel</script></argvalue><argvalue name="Adresszeile_1_Strasse_Empfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Adresszeile_1_Strasse_Empfaenger</script></argvalue><argvalue name="Adresszeile_2_Strasse_Empfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Adresszeile_2_Strasse_Empfaenger</script></argvalue><argvalue name="Adresszeile_3_Strasse_Empfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Adresszeile_3_Strasse_Empfaenger</script></argvalue><argvalue name="Ort_Emfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Ort_Empfaenger</script></argvalue><argvalue name="Ort2_Emfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Ort_2_Empfaenger</script></argvalue><argvalue name="PLZ_Emfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.PLZ_Empfaenger</script></argvalue><argvalue name="Land_Emfaenger"><script>Human_Resources.db_people_Datenfelder.Adressinformationen.Land_Empfaenger</script></argvalue><argvalue name="Unternehmen"><var name="Human_Resources.db_people_Datenfelder.Absenderinformationen.Unternehmen" type="string" /></argvalue></fraglink></section><section id="25" name="Adress DB"><fraglink id="76" resid="190000844"><argvalue name="Abt_Gruppe"><var name="Human_Resources.db_people_Datenfelder.Absenderinformationen.Abteilung_Gruppe" type="string" /></argvalue

Ein Datenfeld sieht
entweder so: <var name="Human_Resources.db_people_Datenfelder.Absenderinformationen.Region" type="string" />
oder so: <script>Human_Resources.db_people_Datenfelder.Adressinformationen.Ort_Empfaenger</script>
aus.

Mein verwendeter Suchstring ist: "Human_Resources.db_people_Datenfelder."

So, nun zur Aufgabe:

Die Datei soll nach dem Suchstring durchsucht werden. Jedesmal, wenn der String gefunden wurde, soll nicht nur der Suchstring, sondern das komplette Datenfeld in eine Logdatei geschrieben werden.
D.h. Das Programm soll nach dem Suchstring "Human_Resources.db_people_Datenfelder." suchen und alles bis zum Zeichen ' " ' oder dem Zeichen '<' ind die Datei schreiben, so dass in der Datei dann beispielsweise folgendes stehen müsste: "Human_Resources.db_people_Datenfelder.Absenderinformationen.Abteilung_Gruppe"

Ich habe versucht es mit einer Batch zu lösen, aber ich glaube mittlerweile, dass die Batch-Mittel, dafür nicht ausreichend sind, weil es sich beim durchsuchen bzw. bei der Ausgabe des Strings an bestimmten Zeichen wie z.B. ">" stört. Auch kann ich in der FOR-Schleife kein Anführungszeichen als delims definieren.

Wer kann mir da denn weiterhelfen. Die Lösung kann entweder ein Batch-Skript oder auch ein VB-Skript (ich denke, das bietet mehr Möglichkeiten) sein.

Vielen Dank schon mal im voraus.

Content-Key: 115952

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

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

Mitglied: 77559
77559 May 13, 2009 at 10:20:34 (UTC)
Goto Top
Hallo Alexander,

eine etwas knapper gefasste Frage hätte wahrscheinlich auch genügt und erhöht die Wahrscheinlichkeit von Antworten. face-wink

Zum bearbeiten / extrahieren von XML Daten gibt es zwar bessere Lösungen (XML, DTD,XSL,XSLT etc).
Aber ein "quick and dirty" Batch mit der Hilfe von Sed (hier klicken) sollte dafür genügen.

Das Escapen des Anführungszeichens bringt sed beim Interpretieren der Kommandozeile etwas aus dem Tritt, deshalb sind zwei Kommandos nötig.

@echo off
:: Zu bearbeitende Datei wird als Argument erwartet
set Sed="%ProgramFiles%\GnuWin32\bin\Sed.exe"  
:: set Sed="%ProgramFiles(x86)%\GnuWin32\bin\Sed.exe"  
Set Log=%UserProfile%\LogFile.txt
Set TempF="%Temp%\TempFile%Random%.txt"  
Set "Suche=Human_Resources.db_people_Datenfelder"  

:: Alle <>" gegen Zeilenwechsel austauschen  
>%TtempF%" %Sed% -e "s/[<>\"]/\n/g" %1  

:: Suchbegriff filtern, Zeilen an Logdatei anhängen.
>>%Log% "%Sed%" -n -e "/%Suche%/p" "%TempF%"  

Gruß
LotPings
Member: akrupp2
akrupp2 May 13, 2009 at 16:33:10 (UTC)
Goto Top
Hallo LotPings,

danke für die schnelle Antwort ich bin nämlich echt verzweifelt. Ich werde Deine Lösung gleich mal ausprobieren (auch wenn ich dafür nicht drum herum komme SED zu verwenden). Vor meiner Aufgabe geht eine Suchen und Ersetzen Operation voraus, die ich über ein anderes Tool realisiere (MB-Search&Replace). Leider hat dieses Tool keine "NUR" suchen Funktion und ein Logfile schreibt es auch nicht. Deswegen, wollte ich die Kontrolle über ein Batch- oder VB-skript umsetzen und ggf. gefundene Strings in ein Logfile schreiben.
Meine Frage habe ich versucht so ausführlich wie möglich zu gestalten, damit die Komplexität der Aufgabe deutlich wird. Aber wenn ich mir Dein Skript anschaue, dann sehe ich, dass die Aufgabe nur mit DOS eigenen Mitteln zu komplex ist.

Wenn ich Deine Lösung getestet habe, werde ich Dir ein Feedback geben.

Gruß Alex