mannekl
Goto Top

erste 6 Zeilen und letzte löschen

erste 6 Zeilen und letzte löschen

Hallo ,
brauche mal dringend Eure Hilfe, sonst komme ich nicht weiter.
Ich habe eine Kontoumsaetze_123456_9874561.cvs-Datei (Excel) und will in dieser

immer die ersten 6 Zeilen gelöscht haben und immer die letzte Zeile auch.Dazwischen

sind aber gefüllte Zeile (ca. 1-300), die drin bleiben sollen, zum einlesen in eine

Access-Datenbank.
Am Ende soll dann noch die Datei umbenannt werden in "Kontoumsaetze".
Kann mir da mal jemand helfen, denn mit einfachen kopieren und umbennenn komme ich

nicht zum Ziel.Dieses will ich mit einen Batch , als *.bat durchführen.
Für Eure hilfreiche Unterstützung, wär ich sehr dankbar.
Manne

Content-Key: 51400

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

Ausgedruckt am: 29.03.2024 um 02:03 Uhr

Mitglied: miniversum
miniversum 12.02.2007 um 11:55:04 Uhr
Goto Top
@echo off & setlocal enabledelayedexpansion

set infile=1.txt
set tempfile=2.txt
set outfile=3.txt
set frontcut=6
set backcut=1

set zeile=0
FOR /F "tokens=1 delims=" %%A in (%infile%) do (  
set /a zeile=!zeile!+1
if !zeile! gtr %frontcut% echo %%A>>%tempfile%
)

set /a zeile=!zeile!-%frontcut%

FOR /F "tokens=1 delims=" %%A in (%tempfile%) do (  
if !zeile! gtr %backcut% echo %%A>>%outfile%
set /a zeile=!zeile!-1
)

miniversum

[Edit]: Nach dem Test Code angepasst
Mitglied: ManneKL
ManneKL 12.02.2007 um 18:29:52 Uhr
Goto Top
Hallo miniversum,
habe den Batch zusammen mit der.cvs-Datei in einen Ordner gelegt und ausgeführt, aber leider ohne Erfolg. das Dos-Fenster geht kurz auf und zu ohne etws gemacht zu haben.
Habe schon verschiedene sachen ausprobiert, aber komme nicht weiter.
Vielleicht kann mir noch jemand behilflich sein?
Gruß
manne
Mitglied: miniversum
miniversum 12.02.2007 um 19:51:03 Uhr
Goto Top
Also getestet habe ich es mit folgender datei:
1
2
3
4
5
6
7
8
9
0
und es funktioniert so bei mir.

Kannst Du mal deine csv Datei posten? (Halt nur die ersten und letzten paar Zeilen)

miniversum
Mitglied: Biber
Biber 12.02.2007 um 20:38:52 Uhr
Goto Top
Hmm, ManneKL und miniversum,

unabhängig von der Fehlersuche (deren Ausgang mich auch interessiert), würde ich eine dreiteilige Strategie vorschlagen:

1.) die .csv-Datei reduziert um die ersten 6 Zeilen in eine Temp-Datei kloppen wie auch in miniversums Skizze.
Dafür würde ich allerdings den sehr viel schnelleren More-Befehl nehmen:
More /+6 Kontoumsaetze_123456.csv %temp%\WithOutFirst6lines.csv

2) was Dir im Batch nicht erspart bleibt, wenn Du die Zeilenanzahl brauchst:
- einmal alle Zeilen durchwackeln und hochzählen:
for /f %%i in (WithOutFirst6lines.csv) do set /a lines+=1
REM in lines steht jetz die Gesamt-Zeilenzahl

3) danach musst Du nochmal, genauso zeilenweise durch (wie in miniversums Beispiel) und alle Zeilen außer der letzten raushauen...

...
REM %lines% ...möge ermittelt sein...
Set /a linesNow=0
for /f "delims=" %%i in (%temp%\WithOutFirst6lines.csv) do call EchoIt "%%i"   
goto :eof

:EchoIt --- Parameter %1 ist eine ganze Zeile "in Anführungszeichen" 
Set /a linesNow+=1
If [%linesNow%] LSS [%Lines%] Echo "%~1" >>output.csv  

Gruss
Biber
Mitglied: ManneKL
ManneKL 13.02.2007 um 18:38:42 Uhr
Goto Top
Hallo miniversum,

hier schicke ich Dir mal einen Ausschnitt der .cvs-Datei:

Umsätze - persönliches Konto (00) Kundennummer: 999/36669999
01.01.2006 - 30.06.2006
Letzter Kontostand 295,06 EUR
Gebuchte Umsätze (Vorgemerkte und noch nicht gebuchte Umsätze sind nicht Bestandteil dieser Aufstellung)
Es werden nur die Umsätze der letzten 120 Tage angezeigt.
Buchungstag Wert Verwendungszweck Soll Haben Waehrung
01.03.2006 01.03.2006 Dauerauftrag an Ruecklagen auf DiBa 100 EUR
03.03.2006 03.03.2006 EC-AUTOMAT 03.03 KARTE 9 -300 EUR
.
.
.

Kontostand (29.06.2006): 498,18 EUR

Meine Versuche sind sehr leienhaft, aber vielleicht kannst Du mir nochmal helfen.
Also, es sollen die ersten 6-Zeilen raus und immer die letzte Zeile und dann soll die cvs-Datei umbenannt werden in KontoumsätzeTagesdatum.cvs.

Würde mich freuen , wenn es klappt.
Gruß
Manne
Mitglied: miniversum
miniversum 13.02.2007 um 20:02:44 Uhr
Goto Top
ich hab deine Datei so genommen:
Umsätze - persönliches Konto (00) Kundennummer: 999/36669999
01.01.2006 - 30.06.2006
Letzter Kontostand 295,06 EUR
Gebuchte Umsätze (Vorgemerkte und noch nicht gebuchte Umsätze sind nicht Bestandteil dieser Aufstellung)
Es werden nur die Umsätze der letzten 120 Tage angezeigt.
Buchungstag Wert Verwendungszweck Soll Haben Waehrung
01.03.2006 01.03.2006 Dauerauftrag an Ruecklagen auf DiBa 100 EUR
02.03.2006 03.03.2006 EC-AUTOMAT 03.03 KARTE 9 -300 EUR
03.03.2006 01.03.2006 Dauerauftrag an Ruecklagen auf DiBa 100 EUR
04.03.2006 03.03.2006 EC-AUTOMAT 03.03 KARTE 9 -300 EUR
05.03.2006 01.03.2006 Dauerauftrag an Ruecklagen auf DiBa 100 EUR
06.03.2006 03.03.2006 EC-AUTOMAT 03.03 KARTE 9 -300 EUR
07.03.2006 01.03.2006 Dauerauftrag an Ruecklagen auf DiBa 100 EUR
08.03.2006 03.03.2006 EC-AUTOMAT 03.03 KARTE 9 -300 EUR
Kontostand (29.06.2006): 498,18 EUR

und habs mit meiner Variante und mit Bibers Variante (leicht abgeändert) probiert:
@echo off & setlocal enabledelayedexpansion

set infile=b.txt
set tempfile=bt.txt
set outfile=out.txt
set frontcut=6
set backcut=1

More +%frontcut% %infile%>%tempfile%


for /f %%i in (%tempfile%) do set /a lines+=1

Set /a linesNow=0
for /f "delims=" %%i in (%tempfile%) do call:EchoIt "%%i"   
goto :eof

:EchoIt --- Parameter %1 ist eine ganze Zeile "in Anführungszeichen" 
Set /a linesNow+=1
If [%linesNow%] LSS [%Lines%] Echo %~1 >>%outfile%
und beides hat funktioniert.
Sieht die csv Datei den so aus im Nodepad oder hast du die aus Excel rauskopiert?

miniversum
Mitglied: Biber
Biber 13.02.2007 um 21:28:07 Uhr
Goto Top
[nicht weiter wichtige Fussnote]
"enableDelayedExpansion" und das nie verwendete %backcut% könnte man/frau sich für schlechtere Zeiten zurücklegen...

Aber sonst sehe ich es ähnlich... es sollte eigentlich funktionieren.

Wollen wir es nochmal mit den konkreten Pfad/Dateinamen durchspielen, Manne_KL?

Gruss
Biber
Mitglied: ManneKL
ManneKL 14.02.2007 um 08:09:46 Uhr
Goto Top
Hallo miniversum + biber,

habe den Dateiausschnitt aus der Kontoumsatz.csv in Nodepad kopiert und

editiert(Zeilen + Zeichen gelöscht).In der Verarbeitung soll dann aber nur mit der

*.csv-Datei realisiert werden.
Der Pfad, wo die Datei + der Batch liegen ist:
C:\Kontoumsätze

Ich weis nicht woran daß liegen kann , daß es bei mir nicht funktioniert

(Leerzeichen in der Datei, kann ich nicht erkennen und...)

Danke im voraus für Eure Hilfe, aber wenn meine Experimente erfolglos beiben, dann

gebe ich auf.

Manne
Mitglied: miniversum
miniversum 14.02.2007 um 19:42:31 Uhr
Goto Top
Versuchs mal zur probe nicht mit C:\Kontoumsätze sondern mit C:\Kontoumseatze.
Vermeide Leerzeichen, Umlaute und Sonderzeichen in den Datei- und Verzeichnisnamen.
Versuchs mal mit Namen wie a.csv oder 1.csv

miniversum
Mitglied: ManneKL
ManneKL 17.02.2007 um 09:27:52 Uhr
Goto Top
Hallo miniversum+Biber,
habe euren Vorschlag erfolgreich umsetzen können,hat mich einige Mühe gekostet aber dank Euerer unbezahlbaren Hilfe habe ich meine Dateibezeichnungen angeglichen und es funktioniert.Bis auch das löschen der letzten Zeile:Kontostand (29.06.2006): 498,18 EUR, die bleibt in der neuen Datei stehen.wie bekomme ich diese aber noch raus?
Bitte Euch nochmals um Hilfe.
Viele Grüße
Manne
Mitglied: miniversum
miniversum 17.02.2007 um 12:16:16 Uhr
Goto Top
Wie sieht deine Batch datei den nun aus. Kansnt Du die mal Posten?

gib mal:
nach Bibers Version nach dem
for /f %%i in (%tempfile%) do set /a lines+=1
das lines mit
echo %lines%
und nach meiner Version nach dem
set /a zeile=!zeile!-%frontcut%
das zeile mit
echo %zeile%
aus.

Dies sollte der Anzahl der Zeilen der Datei - 6 entsprechen.

miniversum
Mitglied: ManneKL
ManneKL 17.02.2007 um 16:26:33 Uhr
Goto Top
Hallo miniversum,
hier ist der Batch, wo die letzte Zeile nicht gelöscht wird:

@echo off & setlocal enabledelayedexpansion

set infile=Kontoumsaetze2.csv
set tempfile=Kontoumsaetze_temp.csv
set outfile=Kontoumsaetze_out2.csv
set frontcut=6
set backcut=1

More +%frontcut% %infile%>%tempfile%

for /f %%i in (%tempfile%) do set /a lines+=1

Set /a linesNow=0
for /f "delims=" %%i in (%tempfile%) do call:EchoIt "%%i"
goto :eof

:EchoIt --- Parameter %1 ist eine ganze Zeile "in Anführungszeichen"
Set /a linesNow+=1
If [%linesNow%] LSS [%Lines%] Echo %~1 >>%outfile%


Vielleicht findest Du den Fehler wo die letzte gelöscht wird.
gruß
Manne
Mitglied: ManneKL
ManneKL 17.02.2007 um 17:03:00 Uhr
Goto Top
Hallo miniversum,
habe die echo %lines% ergänzt und es funktioniert Deine Variante!
Vielen,vielen ...Dank für Eure Hilfe.

Gruß
Manne