freshman2017
Goto Top

Bestimmte Daten aus CSV per Windows BATCH Datei in .txt Format schreiben lassen.

Hallo Gemeinde,

leider zerbreche ich mir gerade den Kopf beim Erstellen einer Batch Datei, wie ich am besten Werte aus einer exportierten .CSV Liste auslesen kann,
die dann in einem bestimmten Format in eine .txt Liste geschrieben werden sollen (Semikolon-getrennt), wenn der Zahlenwert in einer bestimmten Spalte > (größer als) 0 ist.

Alle Daten würden in einem TEST Ordner auf dem Desktop liegen.

Die .CSV ist wie folgt aufgebaut:

NR,NR1,NR2,NR3,NAME,VORNAME,PLZ,ORT,STRASSE,DATUM1,DATUM2,ARTIKELNAME,NR4,MENGE,TAXE,TAXE1,BRUTTO,TAXE3,NR5,NR6,NR7,

Per Batch-Datei (.bat) sollen zunächst die Zeilen ausgelesen werden und wenn die "18. Spalte" (TAXE3) > (größer als) 0 ist, dann soll diese Zeile, wo der Wert > (größer als) 0 ist, in eine .txt Datei geschrieben werden, einfach hintereinander.

Die Zeilen in der .txt Datei sollen wie folgt sein:

Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;

"Kopf, Rechnung , Daten , R-1 , Ja" sowie die Semikolons müssen zwischen NR4 und NR1 stehen bleiben.

Hat der wer von Euch eine Idee?

Wenn also mehrere Datensätze mit > (größer als) 0 vorhanden sind, soll die Batch Datei diese einfach in der TXT Datei hintereinander schreiben:

Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;Kopf;Rechnung;NR3;Daten;R-1;TAXE3;Ja;ARTIKELNAME;NR4;;;;;;;;;NR1;DATUM1;DATUM2;

Ich freue mich auf eine rege Beteiligung face-smile

Content-Key: 332451

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

Ausgedruckt am: 19.03.2024 um 08:03 Uhr

Mitglied: 132692
132692 17.03.2017 aktualisiert um 22:41:01 Uhr
Goto Top
Moin.
Würde ich stattdessen schnell mit Powershell abfackeln:
$quelle = "$env:USERPROFILE\Desktop\TEST\quelle.csv"  
$ziel = "$env:USERPROFILE\Desktop\TEST\ziel.txt"  
$csvdata = Import-csv $quelle -Delimiter ","  
($csvdata | ?{[double]$_.TAXE3 -gt 0} | %{"Kopf;Rechnung;$($_.NR3);Daten;R-1;$($_.TAXE3);Ja;$($_.Artikelname);$($_.NR4);;;;;;;;;$($_.NR1);$($_.Datum1);$($_.Datum2);"}) -join "" | set-content $ziel  
Wenn's immer noch das verstaubte Batch sein muss:
@echo off &setlocal
set "quelle=%userprofile%\Desktop\TEST\quelle.csv"  
set "ziel=%userprofile%\Desktop\TEST\ziel.txt"  
>"%ziel%" (for /f "usebackq skip=1 tokens=1-21 delims=," %%a in ("%quelle%") DO if %%r GTR 0 echo|set /p="Kopf;Rechnung;%%d;Daten;R-1;%%r;Ja;%%l;%%m;;;;;;;;;%%b;%%j;%%k;")  
Ich freue mich auf eine rege Beteiligung
Naja, ich habe den Text bestimmt 20 mal lesen müssen bevor mir klar war was eigentlich gewünscht ist, zumal das auseinanderhalten der Variablen und statischen Text hier nicht nicht ganz eindeutig ist.
Den anderen ging es bestimmt nicht anders, sieht man an der Beteiligung ;-P

Gruß p.
Mitglied: freshman2017
freshman2017 17.03.2017 um 19:07:49 Uhr
Goto Top
Moin pattern,

ich bedanke mich für deinen Tipp. Ich bin eher jemand , der lieber batch Dateien nutzt.

Wenn ich richtig liege, muss ich zum testen das ganze wie folgt anpassen, oder?

@echo off &setlocal
set "quelle=C:\Users\User01\Desktop\TEST\Desktop\TEST\quelle.csv"  
set "ziel=C:\Users\User01\Desktop\TEST\ziel.txt"  
>"%ziel%" (for /f "usebackq skip=1 tokens=1-21 delims=," %%a in ("%quelle%") DO if %%r GTR echo|set /p="Kopf;Rechnung;%%d;Daten;R-1;%%r;Ja;%%l;%%m;;;;;;;;;%%b;%%j;%%k;")  
Mitglied: freshman2017
freshman2017 17.03.2017 um 19:21:29 Uhr
Goto Top
So meinte ich eigentlich:

@echo off &setlocal
set "quelle=C:\Users\User01\Desktop\TEST\quelle.csv"  
set "ziel=C:\Users\User01\Desktop\TEST\ziel.txt"  
>"%ziel%" (for /f "usebackq skip=1 tokens=1-21 delims=," %%a in ("%quelle%") DO if %%r GTR echo|set /p="Kopf;Rechnung;%%d;Daten;R-1;%%r;Ja;%%l;%%m;;;;;;;;;%%b;%%j;%%k;")  
Mitglied: 132692
132692 17.03.2017 aktualisiert um 20:01:28 Uhr
Goto Top
Wenn ich richtig liege, muss ich zum testen das ganze wie folgt anpassen, oder?
Nein brauchst du nicht, die Variable %userprofile% enthält schon den Pfad zum Userprofil des aktuellen Users face-wink, du brauchst also nichts anpassen! Einfach nur einen Ordner TEST auf dem Desktop anlegen und dort eine quelle.csv rein packen, Batch ausführen, fertig.
Mitglied: freshman2017
freshman2017 17.03.2017 um 20:24:02 Uhr
Goto Top
Ich habe es gerade versucht, aber als blutiger Anfänger noch nicht hinbekommen. Habe nachfolgende .csv:

NR,NR1,NR2,NR3,NAME,VORNAME,PLZ,ORT,STRASSE,DATUM1,DATUM2,ARTIKELNAME,NR4,MENGE,TAXE,TAXE1,BRUTTO,TAXE3,NR5,NR6,NR7,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,12342,123452,23,123

Dabei habe ich im Texteditor die .bat mit ANSI Codierung erstellt:

@echo off &setlocal
set "quelle=%userprofile%\Desktop\TEST\quelle.csv"  
set "ziel=%userprofile%\Desktop\TEST\ziel.txt"  
>"%ziel%" (for /f "usebackq skip=1 tokens=1-21 delims=," %%a in ("%quelle%") DO if %%r GTR echo|set /p="Kopf;Rechnung;%%d;Daten;R-1;%%r;Ja;%%l;%%m;;;;;;;;;%%b;%%j;%%k;")  

Wenn ich jetzt die Batch Datei starte, erstellt er mir keine ziel.txt face-sad

Hast Du vielleicht einen Tipp?
Mitglied: freshman2017
freshman2017 17.03.2017 um 20:28:06 Uhr
Goto Top
Kann es an Win10 liegen?
Mitglied: freshman2017
freshman2017 17.03.2017 um 21:04:59 Uhr
Goto Top
Mit dem Power Shell Script klappt es face-smile
Mitglied: freshman2017
freshman2017 17.03.2017 um 22:28:24 Uhr
Goto Top
Ich konnte alles soweit umstellen, und die PowerShell datei sogar per Batch starten lassen.

PowerShell.exe -Command "& 'C:\Users\User01\Desktop\TEST\skript.ps1'"  

Eine Frage habe ich allerdings noch: "Wie kann ich verhindern, dass in der ziel.txt am ende kein umbruch eingefügt wird?"
Mitglied: 132692
Lösung 132692 17.03.2017 aktualisiert um 22:49:59 Uhr
Goto Top
Kann es an Win10 liegen?
Nein! Es fehlt bei dir die 0 in der if condition ...
Eine Frage habe ich allerdings noch: "Wie kann ich verhindern, dass in der ziel.txt am ende kein umbruch eingefügt wird?"
Bei Set-Content den Parameter -NoNewline angeben!

Dann bitte noch als gelöst markieren. Danke.

p.s. Man kann seine Antworten bearbeiten, da braucht es nicht 5 neue Kommentare hintereinander face-confused