koefinger
Goto Top

Batch - Suchen und Ersetzen der letzten 2 Zeichen in einer txt Datei

Hallo, ich bin neu hier und würde mich freuen wenn mir jemanden weiterhelfen kann.

Ich habe eine riesige (paar 100000 Zeilen) txt-Datei (TEST.txt), mit folgendem Inhalt:

E4Q 91201 80730 80732 80299 80297 61
E4Q 91202 80731 80298 80733 80734 61
E3T 91203 80301 80733 80298 61
E4Q 91204 80735 80302 80299 80732 61
E4Q 91205 80733 80301 80322 80736 71
E4Q 91206 80737 80303 80302 80735 61
E4Q 91207 80738 80726 80303 80737 61
E4Q 91208 80307 80306 80309 80739 91
E4Q 91209 80307 80739 80725 80318 91

Ist es mittels batch möglich jeweils die letzten beiden Zeichen auszulesen und danach zu ersetzen und zwar mit der bedingung dass z.B.
61 soll 2 werden
71 soll 69 werden
91 soll 45 werden

d.h. das ergebnis sollte folgendermaßen aussehen:
E4Q 91201 80730 80732 80299 80297 2
E4Q 91202 80731 80298 80733 80734 2
E3T 91203 80301 80733 80298 2
E4Q 91204 80735 80302 80299 80732 2
E4Q 91205 80733 80301 80322 80736 69
E4Q 91206 80737 80303 80302 80735 2
E4Q 91207 80738 80726 80303 80737 2
E4Q 91208 80307 80306 80309 80739 45
E4Q 91209 80307 80739 80725 80318 45

Danach soll die Datei überspeichert werden.

Ich tüfftle schon geraume Zeit herum und habe versucht aus den vorhandenen Suchen und Ersetzen Foreneinträgen schlau zu werden,
bisher leider ohne Erfolg.

LG Stefan.

Content-Key: 170397

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

Printed on: April 23, 2024 at 10:04 o'clock

Mitglied: 64748
64748 Jul 25, 2011 at 19:47:58 (UTC)
Goto Top
Guten Abend Stefan,

mit Batch kann ich in diesem Fall nicht helfen. Aber im Editor vim (gibt's auch für Windows ftp://ftp.vim.org/pub/vim/pc/gvim73_46.exe) kannst Du mit den drei Kommandos
:%s/61$/2/
:%s/71$/69/
:%s/91$/45/
Diese Befehle werden im Command-mode ausgeführt.

Markus
Member: Addl123
Addl123 Jul 25, 2011 at 20:11:43 (UTC)
Goto Top
Spontanwürde ich Notepad++ benutzen. Um es ganz einfach zu machen: Mit Macro Aufnehmen, und dann mehrmals abspielen (backspace,backspace,forward,down,back, und dann beliebig oft abspielen).
Mitglied: 64748
64748 Jul 25, 2011 at 20:16:40 (UTC)
Goto Top
Zitat von @Addl123:
Spontanwürde ich Notepad++ benutzen. Um es ganz einfach zu machen: Mit Macro Aufnehmen, und dann mehrmals abspielen
(backspace,backspace,forward,down,back, und dann beliebig oft abspielen).
Naja, Du musst schon gezielt nach dem Vorkommen der Zahlen am Ende der Zeile suchen, also musst Du im Macro die Suchfunktion mit aufnehmen, dann kannst Du aber auch gleich Suchen/Ersetzen benutzen, so wie ich's oben beschrieben habe.

Markus
Member: Lochkartenstanzer
Lochkartenstanzer Jul 25, 2011 at 20:33:49 (UTC)
Goto Top
Zitat von @koefinger:

Mit cygwin geht das:

61 soll 2 werden
sed -e "s/61$/2/g" -i TEST.txt
71 soll 69 werden
sed -e "s/71$/69/g" -i TEST.txt
91 soll 45 werden
sed -e "s/91$/45/g" -i TEST.txt
Member: Addl123
Addl123 Jul 25, 2011 at 20:38:56 (UTC)
Goto Top
Zitat von @64748:
> Zitat von @Addl123:
> ----
> Spontanwürde ich Notepad++ benutzen. Um es ganz einfach zu machen: Mit Macro Aufnehmen, und dann mehrmals abspielen
> (backspace,backspace,forward,down,back, und dann beliebig oft abspielen).
Naja, Du musst schon gezielt nach dem Vorkommen der Zahlen am Ende der Zeile suchen, also musst Du im Macro die Suchfunktion
mit aufnehmen, dann kannst Du aber auch gleich Suchen/Ersetzen benutzen, so wie ich's oben beschrieben habe.

Markus


face-smile

Ich hab zu schnell geantwortet, ich hab gedacht er will die letzten zwei Zeichen löschen (ich hab mir nur schnell das Ergebnis angeschaut). Wobei das was er will ja nicht schwer ist, da es ja immer Leerzeichen ## Absatz ist. Geht ja auch mit extenden / regular expressions (in N++) (z.B. mit RegEx suchen " 91§" und ersetzen " 45$".
Member: bastla
bastla Jul 25, 2011 at 20:41:32 (UTC)
Goto Top
Hallo koefinger und willkommen im Forum!

Soferne es keine zwingenden Gründe für die Verwendung von Batch gibt, würde ich eher ein VBScript verwenden, etwa:
Datei = "D:\TEST.txt"  
Von =  Array("61", "71", "91")  
Nach = Array("2",  "69", "45")  

Set fso = CreateObject("Scripting.FileSystemObject")  
T = fso.OpenTextFile(Datei).ReadAll

For i = 0 To UBound(Von)
    T = Replace(T, " " & Von(i) & vbCrLf, " " & Nach(i) & vbCrLf)  
Next

fso.CreateTextFile(Datei).Write T
Vorausgesetzt habe ich Windows-Zeilenumbrüche (CR + LF) und dass auch die letzte Zeile mit einem Umbruch endet, sowie dass vor jedem Suchbegriff ein Leerzeichen steht.

Die "Von"- und "Nach"-Listen müssen gleich viele Einträge haben, sind aber ansonsten beliebig erweiterbar, wobei natürlich zu beachten ist, dass auch mehrfach ersetzt würde - käme also etwa noch von "69" nach "23" hinzu, würden alle Zeilen, welche ursprünglich "69" enthalten haben, aber auch alle, welche von "71" auf "69" geändert wurden, den Wert "23" erhalten - daher ggf die Reihenfolge anpassen!

Achtung: Es wird, wie gewünscht, die Datei (ohne Sicherungskopie) ersetzt.

Grüße
bastla
Mitglied: 64748
64748 Jul 25, 2011 at 20:45:09 (UTC)
Goto Top
Hallo Lochkartenstanzer,

ich glaube das g (alle Vorkommen in der Zeile) kann man in dem Fall weglassen da ja gezielt nach dem Vorkommen am Zeilenende gesucht wird.

Markus
Member: koefinger
koefinger Jul 25, 2011 at 21:08:54 (UTC)
Goto Top
Spitze, herzlichen Dank an alle für die rasche Hilfe.

Hab' jetzt die Lösung von Bastla vorgezogen, da ich mit VB noch am ehesten zurechtkomme.

Funktioniert übrigens spitze... genauso wie ich es wollte.

1000Dank
Member: Lochkartenstanzer
Lochkartenstanzer Jul 26, 2011 at 05:21:39 (UTC)
Goto Top
Nun ja, das g komtm bei mir aus Gewohnheit immer mit dazu. Es würde natürlich auch ohne gehen.