[BATCH] CSV nach bestimmter Spalte sortieren

batch_prog

Cadet 2nd Year
Registriert
März 2017
Beiträge
27
Hallo,

vielleicht könntet Ihr mir helfen?
Angenommen eine CSV sieht wie folgt aus:

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,250.00,123452,23,123,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ac,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ac,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
a,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,
ab,b,c,d,MUSTERMANN,MAX,12345,MUSTERSTADT,MUSTERSTRAßE 1,17.03.2017,16.03.2017,ABC2,12345,12,19,20,23,250.00,123452,23,123,


Es wäre doppelte / unsortierte Einträge vorhanden. Wie kann ich, bspw. nach der 1. Spalte sortieren, bevor ich mit einem Batch (s.u.) doppelte Einträge rauslösche?

@echo off &setlocal
set "src=%userprofile%\Desktop\CSV\Exporte\quelle.csv"
set "dst=%userprofile%\Desktop\CSV\Exporte\zielohnedup-%DATE%.csv"

set "before="
setlocal EnableDelayedExpansion
<"!src!" >"!dst!" (
for /f %%i in ('type "!src!"^|find /c /v ""') do for /l %%j in (1 1 %%i) do (
set "ln=" &set /p "ln="
for /f "tokens=3 delims=," %%k in ("!ln!") do if "!before!" neq "%%k" (
echo(!ln!
set "before=%%k"
)
)
)
 
Zuletzt bearbeitet:
OT aber ich kann nicht widerstehen:
Wenn es WSH schon seit Windows 98 (!) bei jedem Windows dabei ist, wenn cmd von Powershell abgelöst wird, wieso nutzt man bei solchen Aufgaben immer noch Batchdateien? Die ganzen for tokens find und delims Schleifen funktionieren in MS-DOS ja auch nicht mehr, und alle anderen haben WSH dabei.

Da kann man dann auch sehr einfach, strukturiert und ohne Spaghetticode einzelne Einträge löschen, sortieren, etc.
 
Zum Sortieren würde ich Powershell benutzen, Batch ist obsolet:
Code:
Import-Csv quelle.csv | sort NR -Descending | Export-csv -Path ziel.csv -NoTypeInformation
Anstatt descending kannst du auch ascending benutzen beim sortieren, falls du aufsteigend sortieren willst.
 
Wie würde es im Batch aussehen? Ist das mit der Batch garnicht möglich?
 
Warum ist das wichtig? Ist das ne Schulaufgabe? Wenn man das Ganze mit nem Einzeiler lösen kann, ist das eleganter, als dieser unerträgliche for-find-delims-tokens-Mist. Sicher mag es mit Batch auch irgendwie gehen, nur halte ich Batch an der Stelle für das falsche Werkzeug.
 
Das ist keine Schulaufgabe. Ich habe noch andere Batch Dateien die danach ausgeführt werden sollen.

Ich habe jetzt noch gelesen, dass man Powershell Befehle in Batch Dkripte einbinden könnte?
 
batch_prog schrieb:
Wie würde es im Batch aussehen? Ist das mit der Batch garnicht möglich?
Natürlich geht das auch sehr einfach per Batch, schließlich gibt es den "sort" Befehl. Wenn nach der ersten Spalte sortiert werden soll, braucht es da nicht einmal einen Parameter:
Code:
sort quelle.csv
 
mit sort habe ich es auch schon probiert, aber da kann ich die Spalte nicht festlegen, nach der sortiert werden soll?!
 
batch_prog schrieb:
mit sort habe ich es auch schon probiert, aber da kann ich die Spalte nicht festlegen, nach der sortiert werden soll?!
Du kannst ab einem bestimmten Zeichen sortieren. Wenn Du eine CSV-Datei also nicht nach der ersten Spalte sortieren willst, dann klappt das mit sort nur bei festen Spaltenbreiten.

Du könntest alternativ die Datei temporär umschreiben, so dass die Spalte nach der Du sortieren willst, an erster Stelle steht. Oder Du sortierst mittels for-Schleife und tokens und delims ...
 
Zuletzt bearbeitet:
Zurück
Oben