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

Massendaten Text editor

Frage Entwicklung Batch & Shell

Mitglied: 64142

64142 (Level 1)

15.04.2008, aktualisiert 18.04.2008, 4465 Aufrufe, 14 Kommentare

besser einen dos befehl verwenden, denke ich mir ..

Hallo zusammen,

habe das forum durchsucht, aber noch keinen passenden Hinweis zur Lösung meines Problemes gefunden.

mir liegen ca 15000 xml files vor in denen ein bestimmter string geändert werden sollte.
kann jetzt mit einigen Texteditoren mal 500 dateien öffen, string suchen und ersetzen und wieder abspeichern, für alle Dateien dauert aber auch das eine kleine Ewigkeit.

Da müsste es soch ein Tool oder einen cmd befehl dafür geben, der das schneller löst?
zumal es für mich wohl keine einmalige Aktion bleibt, sondern das öfter vorkommen wird.

Die xml dateien sind ca 40 kB groß und mit jedem beliebigen Editor bisher zu lesen gewesen,
es liegen alle in einem Ordner,
Betriebssystem ist Windows XP - tja, das Unix dort mehr kann, ist mir auch bekannt, aber das hilft mir hier leider auch nicht weiter

Danke für jeden Beitrag zur Lösung.

Gruß
halfprice
Mitglied: geTuemII
15.04.2008 um 18:13 Uhr
Hallo halfprice,

erstmal willkommen hier im Forum.

Sag doch mal, was den auszutauschenden Text auszeichnet (Position in der Datei, Wortlaut...) und wogegen er ausgetauscht werden soll.

geTuemII
Bitte warten ..
Mitglied: SarekHL
15.04.2008 um 18:14 Uhr
Der HTML-Editor Phase 5 beherrscht beispielsweise die Funktion "Dateiübergreifendes Suchen und Ersetzen" ...
Bitte warten ..
Mitglied: miniversum
15.04.2008 um 18:35 Uhr
Ich kann mich nur anschliesen. Poste doch mal den relevanten Teil der Datei und wie es danach aussehen soll.

Der Editor PSPad kann da glaube ich auch mehr Dateien. Dort gibt es auch die Funktion einen ganzen Ordner zu durchsuchen und in allen Dateien (oder durch Benutzung eines Filters nur bestimmten) darin Wörter zu suchen und zu ersetzen.
Bitte warten ..
Mitglied: bastla
15.04.2008 um 19:11 Uhr
Hallo halfprice!

Für eine automatisierte Lösung wären einige weitere Details wichtig, zB:

- Befinden sich die Dateien alle im selben Ordner, und sollen sie dort bleiben?
- Sollen die alten Dateien überschrieben werden, oder brauchst Du Sicherungskopien?
- Sind alter und neuer String jeweils konstant, und woher sollen die Werte dafür kommen?

Grüße
bastla
Bitte warten ..
Mitglied: 64142
16.04.2008 um 13:10 Uhr
- alle Dateien im gleichen Ordner, sollen auch gerne dort bleiben
(wenn nötig können sie auch kopiert werden)
- sicherungskopie brauche ich keine
- sting in den 15000 ist nicht überall drin, sondern kann abweichen.

möglichens szenario:

in 5000 von den 15000 files steht "ich hab dich lieb" in allen anderen "ich hab dich nicht lieb"
die 5000 sollen geöffnet werden diesen "ich hab dich lieb" durch "ich hab dich nicht lieb" ersetzen und einfach wieder speichern.


allerdings suche ich ja ein tool, das auch mal einen gleichen string in 15000 oder sogar 50000 dateien ersetzen könnte (10000 wären schon mal ein guter anfang )
Bitte warten ..
Mitglied: bastla
16.04.2008 um 14:14 Uhr
Hallo halfprice!

Es gibt natürlich, abgesehen von den genannten Editoren, eine Menge an spezialisierten "Search & Replace"-Tools verschiedenster Art und Lizenz - wenn's mit Bordmitteln bzw als Eigenbau gehen soll, dann etwa so:
01.
'SRF.vbs 
02.
Const Ordner = "Z:\Testdaten" 
03.
Const ToReplace = "ich hab dich nicht lieb" 
04.
Const ReplaceBy = "ich hab dich lieb" 
05.
 
06.
Set fso = CreateObject("Scripting.FileSystemObject") 
07.
For Each File In fso.GetFolder(Ordner).Files 
08.
	WScript.Echo "Bearbeite: " & File.Name 
09.
	Text = fso.OpenTextFile(File).ReadAll 
10.
	fso.CreateTextFile(File, True).Write Replace(Text, ToReplace, ReplaceBy) 
11.
Next 
12.
WScript.Echo "Fertig"
Dieses VBScript solltest Du unter Verwendung eines beliebigen Texteditors zB unter "C:\Scripts\SRF.vbs" speichern (falls Du den Windows-Editor verwendest, bitte darauf achten, beim Speichern den Dateinamen unter Anführungszeichen zu setzen, da ansonsten ".txt" angefügt wird) und von der Kommandozeile ("Start / Ausführen / CMD") so starten:
01.
cscript //nologo "C:\Scripts\SRF.vbs"
Auf diese Art siehst Du immer, welche Datei gerade bearbeitet wird. Falls Du diese optische Kontrolle nicht benötigst, entferne einfach die Zeile "WScript.Echo "Bearbeite: " & File.Name" - dann kannst Du das Script auch einfach per Doppelklick ausführen.

In dieser Version wird beim Suchen zwischen Klein- und Großschreibung unterschieden (lässt sich bei Bedarf ändern).

Achtung: Es werden (ohne Sicherung) alle Dateien des angegebenen Ordners überschrieben (auch wenn keine Ersetzung nötig war - dann eben mit dem Originalinhalt) - bitte mit Kopien testen!

Eine Variante, bei der nur veränderte Dateien neu geschrieben werden, kann ich bei Bedarf auch anbieten - die Laufzeit des Scripts würde sich dadurch verlängern, ob allerdings wesentlich, kann ich nicht abschätzen (wäre ggf zu testen).

Grüße
bastla

P.S.: Ich habe mir erlaubt, die Beispielstexte für die Ersetzung etwas zu variieren ...
Bitte warten ..
Mitglied: 64142
16.04.2008 um 17:28 Uhr
Perfekt, das ist genau das, was ich im grunde gesucht habe.
ohne viel schnick/schnack und rasend schnell.

vielen dank.

mir ist allerdings kein unterschied aufgefallen, ob ich es (ohne dem löschen der file.name zeile)per doppelklick, oder aus einer schell heraus öffne (außer natürlich, dass die shell am ende zugeht).

interessant wäre ein log file, das mitgeschrieben wird (im gleichen ordner) in dem einfach die dateinamen geschrieben werden, die neu sind, aber das ist wohl wie in deinem nachsatz, mit performance einbußen verbunden.

DANK dem BASTLA
Bitte warten ..
Mitglied: bastla
16.04.2008 um 17:50 Uhr
Hallo halfprice!

... mit performance einbußen verbunden.
Kannst ja mal testen, ob es eine signifikante Änderung der Laufzeit gibt:
01.
'SRFL.vbs 
02.
Const Ordner = "Z:\Testdaten" 
03.
Const LogFile = "Z:\SRF-Log.txt" 
04.
Const ToReplace = "ich hab dich nicht lieb" 
05.
Const ReplaceBy = "ich hab dich lieb" 
06.
 
07.
Set fso = CreateObject("Scripting.FileSystemObject") 
08.
Set LogF = fso.CreateTextFile(LogFile, True) 
09.
For Each File In fso.GetFolder(Ordner).Files 
10.
	Text = fso.OpenTextFile(File).ReadAll 
11.
	If InStr(Text, ToReplace) Then 
12.
		fso.CreateTextFile(File, True).Write Replace(Text, ToReplace, ReplaceBy) 
13.
		LogF.WriteLine File.Name 
14.
	End If 
15.
Next 
16.
WScript.Echo "Fertig"
Grüße
bastla
Bitte warten ..
Mitglied: 64142
17.04.2008 um 15:28 Uhr
supi - die performance ist nicht wirklich anders.

wie es der teufel will - ich dachte, das brauche ich nicht - muß ich einen string ändern, der in dem xml file über zwei zeilen gehen muß (da ich nicht einen string ändern muß, sondern einen nicht forhandenen einfügen - siehe beispiel)

manchmal steht dort drin folgendes für ein attribute - es gibt bis zu 20:

<gs:Attribute>
<gs:Name>ITEM NAME</gs:Name>
<gs:Value></gs:Value>
</gs:Attribute>

und das attribute soll neu gesetzt werden.
wenn ich dort suchen erstetzen, wie in dem vbs script mache, muß ich einen zeilenumbruch einfügen.

ergebnis sollte sein:

<gs:Attribute>
<gs:Name>ITEM NAME</gs:Name>
<gs:Value>12345</gs:Value>
</gs:Attribute>


vielleicht kann man dort auch einen anderen weg gehen, aber das suchen ersetzen scheint mir ganz brauchbar, brauche nun nur für die zwei strings ein zeichen für zeilenumbruch, oder denke ich falsch?

dachte an sowas, wie:

Const ToReplace = "<gs:Name>ITEM NAME</gs:Name>
<gs:Value></gs:Value>"
Const ReplaceBy = "<gs:Name>ITEM NAME</gs:Name>
<gs:Value>12345</gs:Value>"
Bitte warten ..
Mitglied: miniversum
17.04.2008 um 18:10 Uhr
Versuchs mdamit:
Const ToReplace = "<gs:Name>ITEM NAME</gs:Name>" & vbCrLf & "<gs:Value></gs:Value>"
Const ReplaceBy = "<gs:Name>ITEM NAME</gs:Name>" & vbCrLf & "<gs:Value>12345</gs:Value>"
Bitte warten ..
Mitglied: bastla
17.04.2008 um 18:55 Uhr
... lasse aber das "Const" jeweils weg.

Grüße
bastla
Bitte warten ..
Mitglied: 64142
18.04.2008 um 08:22 Uhr
hm,

tut leider nicht.
er sagt jetzt zwar, dass er die alle bearbeitet, die datei wird auch neu geschrieben (neues datum), aber der inhalt bleibt gleich
so sieht nun mein skript aus - ist da noch was falsch?


'SRF.vbs
Const Ordner = "C:\data"
ToReplace = "<gs:Name>ITEM NAME</gs:Name>" & vbCrLf & "<gs:Value></gs:Value>"
ReplaceBy = "<gs:Name>ITEM NAME</gs:Name>" & vbCrLf & "<gs:Value>12345</gs:Value>"

Set fso = CreateObject("Scripting.FileSystemObject")
For Each File In fso.GetFolder(Ordner).Files
WScript.Echo "Bearbeite: " & File.Name
Text = fso.OpenTextFile(File).ReadAll
fso.CreateTextFile(File, True).Write Replace(Text, ToReplace, ReplaceBy)
Next
WScript.Echo "Fertig"
Bitte warten ..
Mitglied: bastla
18.04.2008 um 12:06 Uhr
Hallo halfprice!

Die Ersetzung erfolgt "case sensitive" - um das zu ändern, bitte die folgende Zeile durch das Hinzufügen von ", 1, -1, vbTextCompare " ändern auf:
01.
fso.CreateTextFile(File, True).Write Replace(Text, ToReplace, ReplaceBy, 1, -1, vbTextCompare )
Je nach Datenherkunft könnte das Zeilenende anstelle von vbCrLF vielleicht nur ein vbCr oder ein vbLF sein.

Schließlich solltest Du die Zeilen noch genau daraufhin untersuchen, ob etwa Leerzeichen oder ein TAB (nicht nur am Zeilenende) enthalten sind - diese müssten natürlich auch im Suchmuster ("ToReplace") entsprechend berücksichtigt werden.

Grüße
bastla

P.S.: Wenn ich die von Dir angegebenen Beispielzeilen verwende, funktioniert's auch schon mit Deinem zuletzt geposteten Script ...

P.P.S.: Bitte setze beim Posten von Scripts oder anderen Inhalten, die möglichst unverändert dargestellt werden sollen, die Tags < code> bzw < /code> (natürlich ohne Leerzeichen).
Bitte warten ..
Mitglied: 64142
18.04.2008 um 13:20 Uhr
Funktioniert - vielen dank nochmal für die Mühen und die Geduld
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Microsoft Office
gelöst Wie kann man die Standard-Schriftart bei einfügen von Text in Word 2013 festlegen? (3)

Frage von Rene1976 zum Thema Microsoft Office ...

VB for Applications
gelöst VBA Text mit Format übertragen und Zeichen ergänzen (11)

Frage von Dau12345 zum Thema VB for Applications ...

Outlook & Mail
gelöst Emails werden ohne Signatur und Text versendet - Outlook 2010 (11)

Frage von IT-com zum Thema Outlook & Mail ...

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 ...