chaoscs
Goto Top

CSV per Batch bearbeiten und als neue csv speichern

Hallo zusammen!

Ich brauche einmal Eure Hilfe.

Eine csv Datei welche per FTP Programm automatisch abgerufen wird soll wie folgt per Batch bearbeitet werden und als xy.csv gespeichert werden.

Die neue Datei soll nur Spalte 1 und die errechnete Spalte 2 enthalten. Trennzeichen ist ein "@" Zeichen

Spalte 2 errechnet sich wie folgt aus der ersten Datei:

Wenn Spalte 8<3 dann setze 0, wenn Spalte 9<4 setze 0,wenn Spalte 10<4 setze 0

Summe aus den Spalten 8+9+10 = Spalte 2

Habt Ihr da vielleicht was für mich ? face-smile

Content-Key: 221514

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

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

Member: mc-doubleyou
mc-doubleyou Nov 08, 2013 at 15:08:35 (UTC)
Goto Top
Hey,

das sieht mir eher nach einem Makro aus als nach einer Batch.
Du kannst zwar mit einer Batch in eine csv Datei schreiben

echo dein Text für A1 > meine.csv
echo dein Text für A2 >> meine.csv
usw.

aber ich fürchte nicht so komplex rechnen.

Aber andere wissen da sicher besser bescheid.

LG mcdy
Member: bastla
bastla Nov 08, 2013 updated at 16:47:13 (UTC)
Goto Top
Hallo chaoscs und willkommen im Forum!

Das könnte zB so gehen:
@echo off & setlocal
set "Ein=D:\Datei.csv"  
set "Aus=D:\xy.csv"  
set "Delim=;"  

del "%Aus%" 2>nul  
for /f "usebackq tokens=1-10 delims=%Delim%" %%a in ("%Ein%") do (  
    if %%h lss 3 (
        >>"%Aus%" echo %%a%Delim%0  
    ) else (
        if %%i lss 4 (
            >>"%Aus%" echo %%a%Delim%0  
        ) else (
            if %%j lss 4 (
                >>"%Aus%" echo %%a%Delim%0  
            ) else (
                set /a Summe=%%h + %%i + %%j
                setlocal enabledelayedexpansion
                >>"%Aus%" echo %%a%Delim%!Summe!  
                endlocal
            )
        )
    )
)
Vorausgesetzt habe ich, dass als Trennzeichen ein Semikolon (siehe Zeile 4) verwendet wird und in den einzelnen Zeilen keine Trennzeichen unmittelbar aufeinander folgen (weil ein onder mehrere Felder leer sind).

Grüße
bastla
Member: chaoscs
chaoscs Nov 08, 2013 at 16:39:14 (UTC)
Goto Top
Hey, erstmal danke für die schnellen Antworten.

Also Trennzeichen ist wie beschrieben das "@" Zeichen.

Spalten gibt es von A-L. Die Spalten D und E sind leer. Die Spalten B,C,D,E,F,G,K,L brauche ich nicht.
Member: bastla
bastla Nov 08, 2013 at 16:46:59 (UTC)
Goto Top
Hallo chaoscs!
Trennzeichen ist wie beschrieben das "@" Zeichen.
Sorry - hatte ich glatt überlesen ... face-sad

Wenn D und E leer sind, müssten eigentlich zwei "@" aufeinander folgen - in diesem Fall:
@echo off & setlocal
set "Ein=D:\Datei.csv"  
set "Aus=D:\xy.csv"  
set "Delim=@"  

del "%Aus%" 2>nul  
for /f "usebackq tokens=1-10 delims=%Delim%" %%a in ("%Ein%") do (  
    if %%g lss 3 (
        >>"%Aus%" echo %%a%Delim%0  
    ) else (
        if %%h lss 4 (
            >>"%Aus%" echo %%a%Delim%0  
        ) else (
            if %%i lss 4 (
                >>"%Aus%" echo %%a%Delim%0  
            ) else (
                set /a Summe=%%g + %%h + %%i
                setlocal enabledelayedexpansion
                >>"%Aus%" echo %%a%Delim%!Summe!  
                endlocal
            )
        )
    )
)
Grüße
bastla
Member: chaoscs
chaoscs Nov 08, 2013 at 17:42:20 (UTC)
Goto Top
Super....also läuft schonmal schön durch. Dauert ca. 5 Min bei 18000 Zeilen. Spalte A tadellos. Spalte B leider immer 0
Member: chaoscs
chaoscs Nov 08, 2013 at 17:46:56 (UTC)
Goto Top
achso...jetzt wäre noch top, wenn die Ausgabedeite ein Semikolon als Trennzeichen hätte, da dass anschließend einlesende Programm keine Definition des @ Zeichens als Trennzeichen zulässt.....Tausend Dank! face-smile
Member: bastla
bastla Nov 08, 2013 updated at 17:49:18 (UTC)
Goto Top
Hallo chaoscs!

Könntest Du mal (unter Verwendung von <code>- und </code>-Tags) ein paar Zeilen aus der Datei posten?

Für die Ausgabe mit Semikolon wäre die Zeile 19 anzupassen:
                >>"%Aus%" echo %%a;!Summe!
Grüße
bastla
Member: chaoscs
chaoscs Nov 08, 2013 at 17:57:03 (UTC)
Goto Top
123456@TestTest@TestTest@@@1,00@6,00@4@4@0@0@0@
654321@TestTest@TestTest@@2,00@315,00@4@4@0@0@0@
546879@TestTest@TestTest@@20,00@149,90@4@4@0@0@0@
213879@TestTest@TestTest@@@35,00@29,50@4@4@0@0@0@
Member: chaoscs
chaoscs Nov 08, 2013 at 17:58:27 (UTC)
Goto Top
quatsch..so natürlich

123456@TestTest@TestTest@@@1,00@6,00@4@4@0@0@0@
654321@TestTest@TestTest@@@2,00@315,00@4@4@0@0@0@
546879@TestTest@TestTest@@@20,00@149,90@4@4@0@0@0@
213879@TestTest@TestTest@@@35,00@29,50@4@4@0@0@0@
Member: bastla
bastla Nov 08, 2013 at 18:07:48 (UTC)
Goto Top
Hallo choscs!

Bei Deinen Beispielzeilen enthalten die Spalten 8 bis 10 ja jeweils die Werte 4,4 und 0, sodass also wegen "Spalte 10 < 4" in allen Fällen das Ergebnis 0 lauten muss ...

Grüße
bastla
Member: chaoscs
chaoscs Nov 08, 2013 at 18:32:02 (UTC)
Goto Top
ahh ok...ich dachte mir, dass die summe aus 4+4+0=8 ist?!?

Es soll auf jeden Fall so sein, dass wenn in einer der Spalten eine 4 ist, auch die vier ausgegeben wird. Ist in zwei Spalten die vier dann halt die 8 und wenn in drei Spalten die 4, dann halt die 12, halt die Summe. Geht das?
Member: bastla
bastla Nov 08, 2013 at 20:56:28 (UTC)
Goto Top
Hallo chaoscs!

Wie soll denn nun die Regel wirklich lauten: Auf jeden Fall die Summe ausgeben, oder nur, wenn eine Spalte zumindest 4 enthält, oder ... ?

Falls tatsächlich die Ausgabe der Summe ohne Bedingung gewünscht wäre, würde sich der Batchauf
@echo off & setlocal
set "Ein=D:\Datei.csv"  
set "Aus=D:\xy.csv"  
set "DelimEin=@"  
set "DelimAus=;"  

del "%Aus%" 2>nul  
for /f "usebackq tokens=1-10 delims=%DelimEin%" %%a in ("%Ein%") do (  
    set /a Summe=%%f + %%g + %%h
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%a%DelimAus%!Summe!  
    endlocal
)
reduzieren ...

Grüße
bastla
Member: chaoscs
chaoscs Nov 08, 2013 at 21:11:33 (UTC)
Goto Top
Im Prinzip ganz einfach:

Ist der Inhalt der Spalten 8-10 kleiner 4 soll er eine 0 in der Spalte setzen. Ist der Wert >=4 soll die Zahl stehen bleiben. Anschließend soll er die Summe aus den Spalten 8-10 ziehen

Bsp.

0 0 0 = 0 0 0 = 0
1 4 2 = 0 4 0 = 4
4 1 4 = 4 0 4 = 8
Member: bastla
bastla Nov 08, 2013 at 21:19:54 (UTC)
Goto Top
Hallo chaoscs!

Dann ist die Umsetzung auch einfach face-wink:
@echo off & setlocal
set "Ein=D:\Datei.csv"  
set "Aus=D:\xy.csv"  
set "DelimEin=@"  
set "DelimAus=;"  
set /a Grenze=4

del "%Aus%" 2>nul  
for /f "usebackq tokens=1-10 delims=%DelimEin%" %%a in ("%Ein%") do (  
    set /a Summe=0
    if %%f geq %Grenze% set /a Summe+=%%f
    if %%g geq %Grenze% set /a Summe+=%%g
    if %%h geq %Grenze% set /a Summe+=%%h
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%a%DelimAus%!Summe!  
    endlocal
)
Grüße
bastla
Member: chaoscs
chaoscs Nov 09, 2013 at 08:00:46 (UTC)
Goto Top
Funktioniert super! Nochmal danke! face-smile
Member: chaoscs
chaoscs Nov 09, 2013 at 08:43:46 (UTC)
Goto Top
Leider fallen einem Fehler erst auf, wenn man damit arbeitet.....Kann man noch eine erste Zeile mit Überschriften und eine dritte Spalte mit einer fixen Zahl einfügen?!?

Ergebnis quasi:

Spalte1 Spalte 2 Spalte 3
xx xy xz
Spalte 1 Summe 1
Spalte 1 Summe 1
Member: bastla
bastla Nov 09, 2013 at 10:30:47 (UTC)
Goto Top
Hallo chaoscs!
Kann man noch eine erste Zeile mit Überschriften und eine dritte Spalte mit einer fixen Zahl einfügen?!?
Man(n) kann face-wink:
@echo off & setlocal
set "Ein=D:\Datei.csv"  
set "Aus=D:\xy.csv"  
set "DelimEin=@"  
set "DelimAus=;"  
set /a Grenze=4
set /a Fix=42

>"%Aus%" echo xx%DelimAus%xy%DelimAus%xz  
for /f "usebackq tokens=1-10 delims=%DelimEin%" %%a in ("%Ein%") do (  
    set /a Summe=0
    if %%f geq %Grenze% set /a Summe+=%%f
    if %%g geq %Grenze% set /a Summe+=%%g
    if %%h geq %Grenze% set /a Summe+=%%h
    setlocal enabledelayedexpansion
    >>"%Aus%" echo %%a%DelimAus%!Summe!%DelimAus%%Fix%  
    endlocal
)
Grüße
bastla