Batch In zwei Dateien zeilen löschen und zusammen fügen

PC FREAKY

Commander
Registriert
März 2010
Beiträge
2.250
Hallo,

leider kenne ich mich in Batch nicht wirklich aus und habe habe ein anliegen:
ich habe folgende zwei .txt Dateien die eine Tabelle enthalten
daten1.txt
daten2.txt
zusatz.csv

Nun soll folgendes geschehen:
In Daten1 & Daten 2 sollen die ersten drei und die letzten drei Zeilen gelöscht werden.
Die Zeilenzahl ist jedoch immer anders

Anschließend sollen alle 3 Dateien (Daten1 Daten2 Zusatz) zu einer Batch Datei (neu .csv) zusammen gefasst werden.
Die Datei Zusatz muss daher immer an erster Stelle stehen.
Anschließend sollen die Daten1.txt und Daten2.txt gelöscht werden.

Wie ist das am einfachsten möglich?

Viele Grüße,
PC FREAKY
 
Zuletzt bearbeitet:
Versuch's mal hiermit:
Code:
@echo off
@setlocal enabledelayedexpansion


REM datei1.txt beschneiden

Set /A "Counter=0"
FOR /F "delims=" %%A IN ('findstr /N .* "datei1.txt"') DO SET /A "COUNTER+=1"

SET /A "COUNTER-=6"
Set /A "Counter2=0"
FOR /F "skip=3 tokens=1* delims=:" %%A IN ('findstr /N .* "datei1.txt"') DO (
	SET /A "COUNTER2+=1"
	if !counter2! leq %counter% (
		if "%%B"=="" (echo.>>datei1.temp) else (echo %%B>>datei1.temp)
	)
)

REM datei2.txt beschneiden

Set /A "Counter=0"
FOR /F "delims=" %%A IN ('findstr /N .* "datei2.txt"') DO SET /A "COUNTER+=1"

SET /A "COUNTER-=6"
Set /A "Counter2=0"
FOR /F "skip=3 tokens=1* delims=:" %%A IN ('findstr /N .* "datei2.txt"') DO (
	SET /A "COUNTER2+=1"
	if !counter2! leq %counter% (
		if "%%B"=="" (echo.>>datei2.temp) else (echo %%B>>datei2.temp)
	)
)

REM Dateien zusammenfügen

type zusatz.csv>neu.csv
type datei1.temp>>neu.csv
type datei2.temp>>neu.csv

del datei1.temp
del datei2.temp
del datei1.txt
del datei2.txt
 
@simpsonsfan: Nicht schlecht. Statt
Code:
'findstr /N .* "datei?.txt"'
würde ich
Code:
'findstr /N "^" "datei?.txt"'
und statt
Code:
(echo %%B>>datei?.temp)
würde ich
Code:
(>>datei?.temp echo %%B)
vorschlagen. Außerdem würde ich ohne verzögerte Erweiterung auskommen wollen, weil sonst alle Ausrufezeichen in datei?.txt gelöscht werden.
 
Stimmt, eigentlich kommt man auch ganz gut ohne verzögerte Erweiterung aus, da man mit findstr ja auch eine Zeilennummer haben kann (Zuerst hatte ich es ohne die Zeilennummer versucht, was dann aber bei Leerzeilen in for keine Ausgabe ergeben hatte; daher dann mit Zeilennummer und Nutzung des zweiten Tokens; durch die Zeilennummer kann man dann auch netterweise auf die verzögerte Erweiterung verzichten.)

Was sind denn die Unterschiede bei den anderen beiden Änderungen? Ich schreibe mir eigentlich relativ selten Batch-Skripte, bin also auch nicht so sehr bewandert.

Mit den Änderungen sähe das Skript dann so aus:
Code:
@echo off

REM datei1.txt beschneiden

Set /A "Counter=0"
FOR /F "delims=" %%A IN ('findstr /N "^" "datei1.txt"') DO SET /A "COUNTER+=1"

SET /A "COUNTER-=3"
FOR /F "skip=3 tokens=1* delims=:" %%A IN ('findstr /N "^" "datei1.txt"') DO (
	if %%A leq %counter% (
		if "%%B"=="" (echo.>>datei1.temp) else (>>datei1.temp echo %%B)
	)
)

REM datei2.txt beschneiden

Set /A "Counter=0"
FOR /F "delims=" %%A IN ('findstr /N "^" "datei2.txt"') DO SET /A "COUNTER+=1"

SET /A "COUNTER-=3"
FOR /F "skip=3 tokens=1* delims=:" %%A IN ('findstr /N "^" "datei2.txt"') DO (
	if %%A leq %counter% (
		if "%%B"=="" (echo.>>datei2.temp) else (>>datei2.temp echo %%B)
	)
)

REM Dateien zusammenfügen

type zusatz.csv>neu.csv
type datei1.temp>>neu.csv
type datei2.temp>>neu.csv

del datei1.temp
del datei2.temp
del datei1.txt
del datei2.txt
 
Ich hab auch schon einige Batch Scripts schreiben müssen, aber der Begriff verzögerte Erweiterung ist mir neu. Was ist das?
 
Normalerweise wird eine Variable in einer Batch quasi sofort wenn sie geschrieben wird durch ihren Wert ersetzt.
Mit "setlocal enabledelayedexpansion" und der Verwendung von Ausrufezeichen, kann man dieses Verhalten verhindern.
Code:
@echo off
setlocal enabledelayedexpansion

set /A "test=1"

for /L %%a in (1,1,4) do (
	set /a "test+=1"
	echo mit verzögerter Erweiterung: !test!
	echo Ohne: %test%
)
pause
 
Zurück
Oben