Batch-Datei für Sortierung sortiert Zahlen größer 99 falsch
Hallo Profis
Ich bin neu hier im Forum und hoffe, ich poste mein Anliegen an der richtigen Stelle. Ich wäre Euch sehr dankbar für einen Hinweis oder die Lösung zu folgendem Problem:
Ich möchte eine Textdatei per batch so sortieren, dass die erste Spalte die Zahlen in aufsteigender Reihenfolge sortiert. Hier ist der beispielhafte Inhalt dieser Textdatei sortieren.txt:
10; LDG; 10; 1234;
20; TDG; 20; 5678;
40; TDG; 40; 13141516;
50; TDG; 50; 17181920;
15; LDG; 15; 9101112;
16; LDG; 16; 9191112;
45; TDG; 45; 9101112;
100; LDG; 100; 9101112;
Dazu habe ich folgende Batch-Datei sortieren.bat (Auszug, denn da sind noch weitere Funktionen drin):
...
type nul>aaaaa.txt
for /f "tokens=1-4 delims=;" %%a in ('(for /f "tokens=1-4" %%e in (C:\test\sortieren.txt^) do @echo %%e %%f %%g %%h^)^|sort') do echo %%a; %%b; %%c; %%d; >>C:\test\aaaaa.txt
...
Das funktioniert bestens, wenn ich in der ersten Spalte keine Zahlen größer 99 habe. Aus der oberen Datei, wo die erste Spalte eine 100 hat, sortiert er mir momentan das hier in aaaaa.txt:
10;LDG;10;1234;
100;LDG;100;9101112;
15;LDG;15;9101112;
16;LDG;16;9191112;
20;TDG;20;5678;
40;TDG;40;13141516;
45;TDG;45;9101112;
50;TDG;50;17181920;
Was könnte dafür die Ursache sein bzw. wie bekomme ich das Problem gelöst, dass er die Hunderter korrekt einsortiert?
Ich kann es mir einfach nicht erklären, bin allerdings auch noch kein Batch-Profi, sondern erst Anfänger.
Ich bedanke mich schon mal vorweg für hilfreiche Antworten.
Beste Grüße,
Ralf
Ich bin neu hier im Forum und hoffe, ich poste mein Anliegen an der richtigen Stelle. Ich wäre Euch sehr dankbar für einen Hinweis oder die Lösung zu folgendem Problem:
Ich möchte eine Textdatei per batch so sortieren, dass die erste Spalte die Zahlen in aufsteigender Reihenfolge sortiert. Hier ist der beispielhafte Inhalt dieser Textdatei sortieren.txt:
10; LDG; 10; 1234;
20; TDG; 20; 5678;
40; TDG; 40; 13141516;
50; TDG; 50; 17181920;
15; LDG; 15; 9101112;
16; LDG; 16; 9191112;
45; TDG; 45; 9101112;
100; LDG; 100; 9101112;
Dazu habe ich folgende Batch-Datei sortieren.bat (Auszug, denn da sind noch weitere Funktionen drin):
...
type nul>aaaaa.txt
for /f "tokens=1-4 delims=;" %%a in ('(for /f "tokens=1-4" %%e in (C:\test\sortieren.txt^) do @echo %%e %%f %%g %%h^)^|sort') do echo %%a; %%b; %%c; %%d; >>C:\test\aaaaa.txt
...
Das funktioniert bestens, wenn ich in der ersten Spalte keine Zahlen größer 99 habe. Aus der oberen Datei, wo die erste Spalte eine 100 hat, sortiert er mir momentan das hier in aaaaa.txt:
10;LDG;10;1234;
100;LDG;100;9101112;
15;LDG;15;9101112;
16;LDG;16;9191112;
20;TDG;20;5678;
40;TDG;40;13141516;
45;TDG;45;9101112;
50;TDG;50;17181920;
Was könnte dafür die Ursache sein bzw. wie bekomme ich das Problem gelöst, dass er die Hunderter korrekt einsortiert?
Ich kann es mir einfach nicht erklären, bin allerdings auch noch kein Batch-Profi, sondern erst Anfänger.
Ich bedanke mich schon mal vorweg für hilfreiche Antworten.
Beste Grüße,
Ralf
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-Key: 392878
Url: https://administrator.de/contentid/392878
Ausgedruckt am: 29.03.2024 um 09:03 Uhr
5 Kommentare
Neuester Kommentar
Was könnte dafür die Ursache sein bzw. wie bekomme ich das Problem gelöst, dass er die Hunderter korrekt einsortiert?
Genügend Nullen voranstellen und von hinten passend die Zahl inkl evt. Nullen extrahieren. Hier z.B. immer 4 Stellen von rechts.set "num=00099"
set "numforsort=%num:~-4%"
A.
Moin,
Die Ursache heißt alphanumerische Sortierung. Im Unterschied zur numerischen Sortierung wird bei der alphanumerischen nicht nach dem Wert der Zahl, sondern nach dem Wert des ersten Zeichens sortiert. Wenn das nicht eindeutig ist, dann nach dem Wert des zweiten usw. Hast Du also
kommt heraus
Bei Zahlen ist es dann genauso. Sortierst Du alphanumerisch, dann kommt bei
erwartungsgemäß das heraus:
Lösung: wie schon @137846 schrieb führende Nullen.
hth
Erik
Zitat von @RalfPL18:
Was könnte dafür die Ursache sein bzw. wie bekomme ich das Problem gelöst, dass er die Hunderter korrekt einsortiert?
Was könnte dafür die Ursache sein bzw. wie bekomme ich das Problem gelöst, dass er die Hunderter korrekt einsortiert?
Die Ursache heißt alphanumerische Sortierung. Im Unterschied zur numerischen Sortierung wird bei der alphanumerischen nicht nach dem Wert der Zahl, sondern nach dem Wert des ersten Zeichens sortiert. Wenn das nicht eindeutig ist, dann nach dem Wert des zweiten usw. Hast Du also
Alfred
Hans
Anne
Bruno
Berta
kommt heraus
Alfred
Anne
Berta
Bruno
Bei Zahlen ist es dann genauso. Sortierst Du alphanumerisch, dann kommt bei
1
10
11
100
101
erwartungsgemäß das heraus:
1
10
100
101
11
Lösung: wie schon @137846 schrieb führende Nullen.
hth
Erik
In PowerShell gibt es zwar das gleiche Problem,
aber dafür eine sehr schöne Lösung.
Hierbei wird on the fly ein (virtueller) Sortierschlüssel gebildet der alle Zahlen auf eine einheitliche Länge bringt (links mit Leerzeichen aufgefüllt) so das das alphabetische Sortieren wieder korrekte Werte ergibt.
Ausgabe
aber dafür eine sehr schöne Lösung.
Hierbei wird on the fly ein (virtueller) Sortierschlüssel gebildet der alle Zahlen auf eine einheitliche Länge bringt (links mit Leerzeichen aufgefüllt) so das das alphabetische Sortieren wieder korrekte Werte ergibt.
:: Q:\Test\2018\11\16\AD_392878.cmd
@Echo off&SetLocal EnableExtensions EnableDelayedExpansion
Set "INP=.\sortieren.txt"
Set "OUT=.\sortiert.txt"
:: um überschaubare Zeilenlängen zu erhalten wird der Befehl aus Variablen erstellt.
Set "$TO=$ToNatural={[regex]::Replace($_,'\d+',{ $args.Value.PadLeft(20)})}"
powershell -NoP -C "%$TO%;Get-Content '%INP%'|Sort-Object $ToNatural|Set-Content '%OUT%'"
type "%OUT%"
Ausgabe
> AD_392878.cmd
10; LDG; 10; 1234;
15; LDG; 15; 9101112;
16; LDG; 16; 9191112;
20; TDG; 20; 5678;
40; TDG; 40; 13141516;
45; TDG; 45; 9101112;
50; TDG; 50; 17181920;
100; LDG; 100; 9101112;