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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 115952
Url: https://administrator.de/forum/string-in-dateien-suchen-und-in-andere-datei-schreiben-wenn-gefunden-115952.html
Ausgedruckt am: 07.04.2025 um 21:04 Uhr
2 Kommentare
Neuester Kommentar

Hallo Alexander,
eine etwas knapper gefasste Frage hätte wahrscheinlich auch genügt und erhöht die Wahrscheinlichkeit von Antworten.
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.
Gruß
LotPings
eine etwas knapper gefasste Frage hätte wahrscheinlich auch genügt und erhöht die Wahrscheinlichkeit von Antworten.
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