pmaterina
Goto Top

VBS - Suchen und Ersetzen

Gude,

ich habe eine "kleine Anforderung", die ich leider nicht im Stande bin selbst zu lösen, da ich mich mit vbs leider kaum bis garnicht auskenne...

Soweit ich im Forum gelesen habe, eignet sich Batch nicht wirklich für das Suchen&Ersetzen von Ausdrücken,
die unter anderem nicht nur Groß/klein-Schreibung unterscheiden sollen, sondern auch Zahlen und Sonderzeichen .-+()/\&ßüÜäÄöÖ beinhalten.
(Lasse mich gerne eines Besseren belehren)

Zu meinem Problem:

Ich habe in Unterordnern jeweils GENAU eine .txt Datei

Ordner/Ordner1/1.txt
Ordner/Ordner2/2.txt
...usw

Die manuell erstellten Textdateien beinhalten hunderte von Zeilen, die nach folgendem Schema aufgebaut sind:

Inhalt1,Inhalt2,Inhalt3,...,Inhalt10 (also IMMER! 10 Indizes pro Datensatz mit Komma getrennt)

Beim Erstellen dieser txt-Dateien sind Fehler entstanden.

"Inhalt7" ist bei manchen Dateien leer!

Inhalt1,Inhalt2,Inhalt3,Inhalt4,Inhalt5,Inhalt6,,Inhalt8,Inhalt9,Inhalt10


Da "Inhalt7" in Abhängigkeit von "Inhalt6" steht, habe ich sämtliche "Inhalt6"-Indizes mit leerem "Inhalt7" in eine separate txt-Datei exportiert.(fiktiv TXT-fehler genannt)
,Inhalt6,,
,Inhalt6,,
,Inhalt6,,
,Inhalt6,,
.
.
.

In einer weitern txt-Datei (fiktiv TXT-korrektur genannt) habe ich eben diese "Inhalt6"-Indizes MIT den vollständigen "Inhalt7"-Indizes.
,Inhalt6,Inhalt7,
,Inhalt6,Inhalt7,
,Inhalt6,Inhalt7,
,Inhalt6,Inhalt7,
.
.
.

"Inhalt6" und "Inhalt7" beinhalten natürlich immer unterschiedliche Werte.

Der zeilenweise Aufbau der TXT-fehler und der TXT-korrektur ist identisch,
d.h. das der Wert aus "Inhalt6" in Zeile 204 in TXT-fehler sich ebenfalls in "Inhalt6" in Zeile 204 in TXT-korrektur wiederfindet.


Nun zu meiner Frage:

Wie kriege ich am "einfachsten" meine fehlenden "Inhalt7"-Indizes in die TXT-Dateien?

MfG
pm

Content-ID: 184349

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

Ausgedruckt am: 23.11.2024 um 05:11 Uhr

bastla
bastla 02.05.2012 um 17:06:17 Uhr
Goto Top
Hallo pmaterina!

Die Datei "TXT-fehler" scheint mir relativ witzlos, da sie sich ja nur durch den fehlenden "inhalt7" von der Dtei "TXT-korrektur" unterscheidet ...

Soll eigentlich die Ersetzung in allen Dateien gleich (unter der Verwendung nur einer einzigen "TXT-korrektur"-Datei) erfolgen?

Grüße
bastla
pmaterina
pmaterina 02.05.2012 um 17:21:00 Uhr
Goto Top
Hallo bastla,

Die Datei "TXT-fehler" scheint mir relativ witzlos, da sie sich ja nur durch den fehlenden "inhalt7" von der
Dtei "TXT-korrektur" unterscheidet ...

ich dachte mir, dass ich in die "TXT-fehler" die zu suchenden Ausdrücke zeilenweise packe...
und in die "TXT-korrektur" die Ausdrücke die schließlichdie zu suchenden Werte ersetzen

Soll eigentlich die Ersetzung in allen Dateien gleich (unter der Verwendung nur einer einzigen "TXT-korrektur"-Datei)
erfolgen?

???
Es soll in den einzelnen txt-Dateien in den Unterordnern ersetzt werden, in denen der "Inhalt7" fehlt, fals das gemeint war...

MfG
pm
bastla
bastla 02.05.2012 um 17:28:15 Uhr
Goto Top
Hallo pmaterina!

Gemeint war, ob es nur eine einzige "Ersetzungs-Tabelle" gibt, die für alle Dateien gelten soll, oder ob es für jeden Ordner eine eigene Liste gibt ...

Grüße
bastla
pmaterina
pmaterina 02.05.2012 um 17:32:47 Uhr
Goto Top
Hallo bastla,

es ist eine datei, die für alle Dateien gelten soll...

Zur Info:
Die Werte "Inhalt6" und "Inhalt7"(fals in txt vorhanden) können in den einzelnen txt Dateien mehrmals auftauchen...
es handelt hierbei um Adressen.

deshalb habe ich das ganze in eine datei zusammengefasst,
damit ich nicht dieselben Werte doppelt verarbeiten muss.
MfG
pm
bastla
bastla 02.05.2012 um 17:49:49 Uhr
Goto Top
Hallo pmaterina!

Da Du die Ordnerstruktur nur sehr allgemein beschrieben hast, zum Testen einmal ein Ansatz für eine einzelne (in Zeile 1 anzugebende) Datei:
Datei = "D:\1.txt"  
Korr = "D:\TXT-korrektur.txt"  

Set fso = CreateObject("Scripting.FileSystemObject")  

'Ersetzungsdaten in Array einlesen  
Nach = Split(fso.OpenTextFile(Korr).ReadAll, vbCrLf)
MaxIndex = UBound(Nach)
ReDim Von(MaxIndex)
For i = 0 To MaxIndex
    Von(i) = "," & Split(Nach(i), ",")(1) & ",,"  
Next

'in gesamter Zieldatei alle Ersetzungen versuchen  
T = fso.OpenTextFile(Datei).ReadAll
For i = 0 To MaxIndex
    T = Replace(T, Von(i), Nach(i))
Next
fso.CreateTextFile(Datei).Write T
Bitte beachten: Am Ende der "TXT-korrektur.txt" darf es keine Leerzeile geben, und die Datei "1.txt" wird durch die korrigierte Version überschrieben.

Grüße
bastla
pmaterina
pmaterina 02.05.2012 um 18:05:45 Uhr
Goto Top
Hallo bastla,

vielen Dank schon mal für die Mühe!
Funktioniert wunderbar!!!

Hätte nicht gedacht, dass das mit "ein par" Zeilen zu lösen ist...


In Bezug auf die Ordnerstruktur:

es ist tatsächlich so, dass ich für dieses Projekt einen Überordner habe, (leider DARF ich nix veröffentlichen, noch nicht einmal den Kundennamen):
Überordner: Kundenname
Unterordner: Ordner_1_von_3
Ordner_2_von_3
Ordner_3_von_3
1_von_4
2_von_4
...usw

in den Unterordnern befinden sich unterschiedlich viele PDF-Dateien und jeweils genau 1 TXT-Datei

Danke nochmal, hast mir immens viel Arbeit erspart!!!

MfG
pm
bastla
bastla 02.05.2012 um 18:10:45 Uhr
Goto Top
Hallo pmaterina!

Freut mich, wenn Dir das schon geholfen hat ... face-smile

Grüße
bastla
pmaterina
pmaterina 02.05.2012 um 18:13:02 Uhr
Goto Top
Hallo bastla,

wäre noch´n riesen Schritt,
falls das mit der Ordnerstruktur klappen sollte, dass ich z.B. nur den Überordner angeben muss...

face-wink

Wenn wir schon dabei sind...:
kennst du zufällig ein gutes tut für vbs?

MfG
pm
bastla
bastla 02.05.2012 um 18:20:08 Uhr
Goto Top
Hallo pmaterina!
falls das mit der Ordnerstruktur klappen sollte, dass ich z.B. nur den Überordner angeben muss...
... dann müsstest Du aber zumindest diese Struktur näher beschreiben (ohne konkrete Namensangaben) - vor allem:
  • Gibt es in jedem Unterordner des Überordners genau eine Textdatei (sodass also vereinfachend alle enthaltenen Textdateien verarbeitet werden können)?
  • Gibt es nur eine Unterordnerebene?

Grüße
bastla
pmaterina
pmaterina 02.05.2012 um 18:21:16 Uhr
Goto Top
Hallo bastla,

kann ich beides mit JA beantworten!

MfG
pm
bastla
bastla 02.05.2012 um 18:35:17 Uhr
Goto Top
Hallo pmaterina!

Dann etwa so:
Ordner = "D:\Kunde1"  
Korr = "D:\TXT-korrektur.txt"  
Typ = "txt" 'in Kleinbuchstaben  

Set fso = CreateObject("Scripting.FileSystemObject")  
'gesamte Ersetzungsdatei einlesen, anhand der Zeilenschaltungen aufteilen und  
'die einzelnen Zeilen im Array "Nach" speichern  
Nach = Split(fso.OpenTextFile(Korr).ReadAll, vbCrLf)
MaxIndex = UBound(Nach) 'Anzahl der eingelesenen Zeilen ermitteln  
ReDim Von(MaxIndex) 'Array für die Suchbegriffe ("inhalt6") in passender Größe erstellen  
For i = 0 To MaxIndex 'alle Ersetzungszeilen durchgehen, ...  
    '... anhand der Kommata aufteilen und alles zwischen 1. und 2. Komma  
    '    (="inhalt6" dieser Zeile) als Suchbegriff in das Array-Element schreiben  
    Von(i) = "," & Split(Nach(i), ",")(1) & ",,"  
Next

'alle Unterordner von "Ordner" durchgehen  
For Each Unterordner In fso.GetFolder(Ordner).SubFolders
    'alle Dateien des jeweiligen Unterordners durchgehen  
    For Each Datei In Unterordner.Files
        'verarbeiten, wenn der Dateityp dem Inahlt der Variablen "Typ" (="txt") entspricht;  
        'dabei den ermittelten Typ in Kleinbuchstaben umwandeln, damit der Vergleich  
        'unabhängig von Groß-/Kleinschreibung funktioniert  
        If LCase(fso.GetExtensionName(Datei.Name)) = Typ Then
            'gesamten Dateiinhalt in die Variable "T" einlesen  
            T = Datei.OpenAsTextStream.ReadAll
            'alle Ersetzungszeilen durchgehen, ...  
            For i = 0 To MaxIndex
                '... die Ersetzung vornehmen und das Ergebnis wieder in "T" schreiben  
                T = Replace(T, Von(i), Nach(i))
            Next
            'Inhalt von "T" in eine neue Datei (mit altem Namen) schreiben  
            fso.CreateTextFile(Datei.Path).Write T
        End If
    Next
Next
Bitte Vorsicht beim Testen - alle Textdateien aller Unterordner des in Zeile 1 angegebenen Ordners werden bearbeitet (und ohne Sicherungskopie überschrieben)!

Grüße
bastla
pmaterina
pmaterina 03.05.2012 um 09:21:39 Uhr
Goto Top
Hallo bastla,

vielen Dank für die Mühe!

Könntest du mir vielleicht noch erklären, was da in den einzelenen Schritten passiert?

MfG
pm
bastla
bastla 03.05.2012 um 09:39:22 Uhr
Goto Top
Hallo pmaterina!

Falls die (inzwischen) eingefügten Kommentarzeilen nicht genügen, einfach nochmal nachfragen ...

Grüße
bastla
pmaterina
pmaterina 03.05.2012 um 16:44:30 Uhr
Goto Top
Hallo bastla,

vielen Dank für die ausführlichen Erklärungen!

Werde demnächst noch schlimmere Sachen machen müssen
und habe hier ja die richtigen Ansprechpartner face-wink


MfG
pm