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
GELÖST

VBS - Suchen und Ersetzen

Frage Entwicklung Basic

Mitglied: pmaterina

pmaterina (Level 1) - Jetzt verbinden

02.05.2012, aktualisiert 16:39 Uhr, 4270 Aufrufe, 14 Kommentare

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?

Mit freundlichen Grüßen
pm
Mitglied: bastla
02.05.2012 um 17:06 Uhr
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
Bitte warten ..
Mitglied: pmaterina
02.05.2012 um 17:21 Uhr
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...

Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
02.05.2012 um 17:28 Uhr
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
Bitte warten ..
Mitglied: pmaterina
02.05.2012 um 17:32 Uhr
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.
Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
02.05.2012 um 17:49 Uhr
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:
01.
Datei = "D:\1.txt" 
02.
Korr = "D:\TXT-korrektur.txt" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
 
06.
'Ersetzungsdaten in Array einlesen 
07.
Nach = Split(fso.OpenTextFile(Korr).ReadAll, vbCrLf) 
08.
MaxIndex = UBound(Nach) 
09.
ReDim Von(MaxIndex) 
10.
For i = 0 To MaxIndex 
11.
    Von(i) = "," & Split(Nach(i), ",")(1) & ",," 
12.
Next 
13.
 
14.
'in gesamter Zieldatei alle Ersetzungen versuchen 
15.
T = fso.OpenTextFile(Datei).ReadAll 
16.
For i = 0 To MaxIndex 
17.
    T = Replace(T, Von(i), Nach(i)) 
18.
Next 
19.
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
Bitte warten ..
Mitglied: pmaterina
02.05.2012 um 18:05 Uhr
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!!!

Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
02.05.2012 um 18:10 Uhr
Hallo pmaterina!

Freut mich, wenn Dir das schon geholfen hat ...

Grüße
bastla
Bitte warten ..
Mitglied: pmaterina
02.05.2012 um 18:13 Uhr
Hallo bastla,

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



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

Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
02.05.2012 um 18:20 Uhr
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
Bitte warten ..
Mitglied: pmaterina
02.05.2012 um 18:21 Uhr
Hallo bastla,

kann ich beides mit JA beantworten!

Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
02.05.2012 um 18:35 Uhr
Hallo pmaterina!

Dann etwa so:
01.
Ordner = "D:\Kunde1" 
02.
Korr = "D:\TXT-korrektur.txt" 
03.
Typ = "txt" 'in Kleinbuchstaben 
04.
 
05.
Set fso = CreateObject("Scripting.FileSystemObject") 
06.
'gesamte Ersetzungsdatei einlesen, anhand der Zeilenschaltungen aufteilen und 
07.
'die einzelnen Zeilen im Array "Nach" speichern 
08.
Nach = Split(fso.OpenTextFile(Korr).ReadAll, vbCrLf) 
09.
MaxIndex = UBound(Nach) 'Anzahl der eingelesenen Zeilen ermitteln 
10.
ReDim Von(MaxIndex) 'Array für die Suchbegriffe ("inhalt6") in passender Größe erstellen 
11.
For i = 0 To MaxIndex 'alle Ersetzungszeilen durchgehen, ... 
12.
    '... anhand der Kommata aufteilen und alles zwischen 1. und 2. Komma 
13.
    '    (="inhalt6" dieser Zeile) als Suchbegriff in das Array-Element schreiben 
14.
    Von(i) = "," & Split(Nach(i), ",")(1) & ",," 
15.
Next 
16.
 
17.
'alle Unterordner von "Ordner" durchgehen 
18.
For Each Unterordner In fso.GetFolder(Ordner).SubFolders 
19.
    'alle Dateien des jeweiligen Unterordners durchgehen 
20.
    For Each Datei In Unterordner.Files 
21.
        'verarbeiten, wenn der Dateityp dem Inahlt der Variablen "Typ" (="txt") entspricht; 
22.
        'dabei den ermittelten Typ in Kleinbuchstaben umwandeln, damit der Vergleich 
23.
        'unabhängig von Groß-/Kleinschreibung funktioniert 
24.
        If LCase(fso.GetExtensionName(Datei.Name)) = Typ Then 
25.
            'gesamten Dateiinhalt in die Variable "T" einlesen 
26.
            T = Datei.OpenAsTextStream.ReadAll 
27.
            'alle Ersetzungszeilen durchgehen, ... 
28.
            For i = 0 To MaxIndex 
29.
                '... die Ersetzung vornehmen und das Ergebnis wieder in "T" schreiben 
30.
                T = Replace(T, Von(i), Nach(i)) 
31.
            Next 
32.
            'Inhalt von "T" in eine neue Datei (mit altem Namen) schreiben 
33.
            fso.CreateTextFile(Datei.Path).Write T 
34.
        End If 
35.
    Next 
36.
Next
Bitte Vorsicht beim Testen - alle Textdateien aller Unterordner des in Zeile 1 angegebenen Ordners werden bearbeitet (und ohne Sicherungskopie überschrieben)!

Grüße
bastla
Bitte warten ..
Mitglied: pmaterina
03.05.2012 um 09:21 Uhr
Hallo bastla,

vielen Dank für die Mühe!

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

Mit freundlichen Grüßen
pm
Bitte warten ..
Mitglied: bastla
03.05.2012 um 09:39 Uhr
Hallo pmaterina!

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

Grüße
bastla
Bitte warten ..
Mitglied: pmaterina
03.05.2012 um 16:44 Uhr
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


Mit freundlichen Grüßen
pm
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(3)

Tipp von agowa338 zum Thema Windows 10 ...

Ähnliche Inhalte
Batch & Shell
Suchen, Ersetzen und Entfernen von Dateiinhalten auf Textbasis (1)

Frage von DanteManor zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell - In Textdatei suchen und ersetzen (5)

Frage von Raaja89 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Batch & Shell
gelöst Powershell String Suchen mit Wildcard und Ersetzen (6)

Frage von herrmanndominic zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
Outlook 2010 findet ost datei nicht (18)

Frage von Floh21 zum Thema Outlook & Mail ...

Windows Server
Server 2008R2 startet nicht mehr (Bad Patch 0xa) (18)

Frage von Haures zum Thema Windows Server ...