grinsebaer
Goto Top

Per Batch Einträge bestimmter Spalten einer Text-Datei löschen und ersetzen

Hi, bin totaler Anfänger in Batch und sitze an folgendem Probelm: Ich soll die Tabelleneinträge bestimmter Spalten in einer Textdatei komplett löschen und allesamt mit Null ersetzen. Mit welchem Befehl kann ich in Batch auf bestimmte Spalten (in meinem Fall Spalten 8-13, wobei die 13. Spalte die letzte is) zugreifen?
Schonmal Danke im Voraus!

P.S.: Die Tabellen sind mehere Tausend Zeilen lang und ich soll das Problem explizit mit Batch lösen..

Content-Key: 242182

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

Printed on: April 25, 2024 at 19:04 o'clock

Member: Xaero1982
Xaero1982 Jun 29, 2014 at 13:13:46 (UTC)
Goto Top
Hi,

Wie sollen Textdateien Spalten haben?

Man kann sie höchstens mit Trennzeichen abgrenzen, aber Spalten als solche gibt es nicht.

Da musst du uns wohl mal ein paar Beispieldaten geben, weil damit kann man nichts anfangen.

Gruß
Member: Grinsebaer
Grinsebaer Jun 29, 2014 at 13:27:51 (UTC)
Goto Top
Die Spalten sind einfach nur durch Leerzeichen voneinander getrennt.
Eine Beispieldatei sieht so aus:

5468 1 1 1 0.01091921 0.01218321 0.00718657 0.29249474 -0.69108094 -0.16363939 99.76503040
6205 1 1 1 0.00243227 0.01142169 0.00631002 0.00911101 -0.44771534 0.35375144 203.74846094
4326 1 1 1 0.01278301 0.00653496 -0.00042589 -0.62553946 -0.40600057 -0.03850601 -83.26634383
1247 1 1 1 0.01102416 0.00615661 0.00636421 0.28275558 0.11690595 0.49247037 97.91485928

Im ersten Teil meiner Batch-Datei sortier ich die Daten numerisch nach der ersten Zeile und füge einen Header ein. Das hab ich soweit hinbekommen. Jetzt muss ich noch die Tabelleneinträge der letzten 3 Spalten löschen bzw. mit 0 ersetzen.

P.S.: Die Daten sehen hier recht ungleichmäßig verteilt aus. In der Textdatei sind die Abstände immer gleich groß und 7-8 Leerzeichen lang..
Member: Xaero1982
Xaero1982 Jun 29, 2014 at 18:58:42 (UTC)
Goto Top
Dein Beispiel hat nur 11 Spalten und keine 13... wasn nu?

Einfach ersetzen oder löschen geht nicht - musst du über eine Tempdatei lösen.

Mit:

@echo off

set "txt=input.txt"  
set "temp=output.txt"  

for /f  "tokens=1-11 delims= " %%a in (%txt%) do echo %%a %%b %%c %%d %%e %%f %%g %%h %%i %%j %%k >> %temp%  
Kannst du alle Spalten auslesen und dann in eine neue Textdatei schieben. Die, die du dann nicht brauchst lässt du weg, also wenn die letzten drei weg sollen %%k %%j %%i und an die Stelle kannst du auch einfach 0 0 0 setzen.

Gruß
Member: Grinsebaer
Grinsebaer Jun 29, 2014 at 19:44:34 (UTC)
Goto Top
Vielen Dank schonma,
das bringt mich meinem Zeil schon sehr nahe. Das mit der temp-Datei ist auch kein Problem. Hab ich vorher auch gemacht. Die überflüssigen Zwischendateien können ja am Ende der Batch-Datei gelöscht werden. Einzig, dass die ursprüngliche Tabellenform nicht mehr hergestellt wird, stört mich ein wenig. Anstatt wie vorher 7-8 Leerzeichen (je nachdem, ob vor dem Wert ein Minus steht) hab ich nun nur noch jeweils ein Leerzeichen zwischen den Werten. Indem ich in die entsprechende Zeile der Batch-Datei ein paar Leerzeichen mehr einbaue, kann ich das Problem etwas umgehen. Dennoch ist die Tabelle durch das Vorzeichen ungleichmäßig. Eine Möglichkeit die ursprüngliche Form beizubehalten gibt es nicht, oder?!

P.S.: Die Spalten hatte ich abgekürzt, weil mir die Vorschau bei weiteren Spalten einen Zeilenumbruch angezeigt hat, so dass keine Tabellenform mehr ersichtlich war.
Member: Xaero1982
Xaero1982 Jun 29, 2014 updated at 20:07:21 (UTC)
Goto Top
Ok... dann musst du bei Tokens aber 1-13 schreiben und das echo entsprechend erweitern...

Das mit der Tabellenform wird nichts - zumindest wüsste ich nicht wie...vielleicht ja der Bastla. Mit Powershell wird das sicher gehen...

Wart mal ab bis morgen... da kommt sicher der Bastla mit einer Lösung um die Ecke face-smile

Gruß
ps: Poste mal bitte eine korrekte Beispieldatei...
Member: Grinsebaer
Grinsebaer Jun 29, 2014 at 20:47:00 (UTC)
Goto Top
Das mit dem Anpassen hab ich schon hinbekommen. Dir schonma vielen Dank für die Hilfe! Für die 3 Zeilen oben hätte ich bestimmt wieder Stunden gebraucht..

Mit der Tabellenform lass ich es jetzt erstma so und versuch das nur zu verbessern, wenn das in der Form nich bearbeitet werden kann. Im Prinzip isses ja nur eine optische Sache.

P.S.: Ich sollte das mit Batch lösen, mit Powershell hab ich nämlich auch noch nie gearbeitet..
Member: colinardo
colinardo Jul 01, 2014, updated at Jul 02, 2014 at 16:46:22 (UTC)
Goto Top
Moin,
Zitat von @Grinsebaer:
P.S.: Ich sollte das mit Batch lösen, mit Powershell hab ich nämlich auch noch nie gearbeitet..
dann wird's aber Zeit für einen Powershell-Einzeiler face-smile
gc "d:\fileIN.txt" | %{$_ -replace '(.*?)\s+(([\.\d-]+\s*){3})$','$1       0        0        0'} | set-content "D:\fileOUT.txt"  
(ersetzt die letzten 3 Spalten jeder Zeile durch Nullen)

oder wenn das gleiche File ersetzt werden soll:
$file = "D:\file.txt"  
(gc $file) -replace '(.*?)\s+(([\.\d-]+\s*){3})$','$1       0        0        0' | set-content $file  
Grüße Uwe

p.s. du siehst es lohnt sich, mit Powershell mal zu beschäftigen face-wink