Textdatei sortieren, Verzeichniss Struktur

Tischbank

Cadet 2nd Year
Registriert
Nov. 2013
Beiträge
18
Guten Tag,

ich habe ein Problem mit der Sortierung einer Textdatei.


Wozu das ganze: Ich möchte die Dateien nachher in richtiger Reihenfolge drucken. Somit ist die richtige Sortierung wichtig.
Die Dateien sollen nachher in einer PDF zusammengefügt werden.
Ich würde sie mit Hilfe der Textdatei nacheinander drucken und somit zu einer PDF zusammenfügen.
Hilfe in dieser Richtung wäre auch nett. (Ohne Zusatzprogramme)


In den unten zu sehenden Text ist ein Ausschnitt aus einer Textdatei (.txt).
Die "xxxx" am Anfang sind für alle Dokumentnamen gleich.
Die "xxx" am Ende jeder Zeile sind unterschiedlich lang und haben verschiedene Inhalte.


xxxx-100-xx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
xxxx-13M-xxx.doc
xxxx-11C-xxx.DOC
xxxx-161A-xxx.doc​


Sortiert sollten die Namen so angeordnet sein:


xxxx-11C-xxx.DOC
xxxx-13M-xxx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
xxxx-100-xx.doc
xxxx-166Bxxx.DOC
xxxx-161A-xxx.doc
xxxx-183Axxx.doc​


Die Dateinamen werden per Batch mit dem Befehl : "dir /b Pfad >> Pfad" ausgegeben.
Da der Befehl den Text nicht in der richtigen Reihenfolge sortiert (der Befehl :"sort" funktioniert auch nicht) bitte ich um Tipps bei diesem Problem.

Wäre nett wenn einer von euch Tipps zur Lösung des Problems hat (für Powershell, Batch oder C/C++).



Lg Tischbank

Vielen Dank schon mal im voraus.
 
Yuuri schrieb:
Code:
cat <dateiname> | sort
schon probiert?

Vielen Dank für deine Antwort.

Leider sortiert er es immer noch falsch:
Erst die
1xxx
1xxx​
Dann die mit einer 2 anfangen:
2xxx
2xxx

3xxx
3xxx

usw.



Lg Tischbank
 
Man bräuchte mal mehr Daten. sort sortiert die Dateien alphanumerisch. Dann bekommst du eine Sortierung wie 1, 10, 11, 2, 21, 22. Wenn du 1, 2, ..., 9, 10, 11, ... haben willst, brauchst du eine natürliche Sortierung. Das wirst du in Batch-Dateien wohl nur sehr umständlich (oder gar nicht?) hinbekommen und solltest da eher auf irgend ein externes Tool ausweichen, was dir dieses anbietet.

Anhand deiner obigen Testdaten, ist die alphanumerische Sortierung vollkommen in Ordnung:
Code:
Original:
xxxx-100-xx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
xxxx-13M-xxx.doc
xxxx-11C-xxx.DOC
xxxx-161A-xxx.doc

Sortiert:
xxxx-100-xx.doc
xxxx-11C-xxx.DOC
xxxx-13M-xxx.doc
xxxx-161A-xxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
Wäre PowerShell eine Option?
Code:
$c = gc t.txt
$NaturalSort = { [regex]::Replace( $_, '\d+', {$args[0].Value.PadLeft( 20 )}) }

echo "Original:"
echo $c
echo "`nSortiert (alphanumerisch):"
echo $c | sort
echo "`nSortiert (natürlich):"
echo $c | sort $NaturalSort
ergibt:
Code:
Original:
xxxx-100-xx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
xxxx-13M-xxx.doc
xxxx-11C-xxx.DOC
xxxx-161A-xxx.doc

Sortiert (alphanumerisch):
xxxx-100-xx.doc
xxxx-11C-xxx.DOC
xxxx-13M-xxx.doc
xxxx-161A-xxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc

Sortiert (natürlich):
xxxx-11C-xxx.DOC
xxxx-13M-xxx.doc
xxxx-21C-xxx.DOC
xxxx-34N-xxx.doc
xxxx-42E-xxx.doc
xxxx-54A-xxx.DOC
xxxx-64A-xxx.doc
xxxx-80Axxx.doc
xxxx-97Axxx.doc
xxxx-100-xx.doc
xxxx-161A-xxx.doc
xxxx-166Bxxx.DOC
xxxx-183Axxx.doc
 
Hallo Yuuri,

danke das du so schnell geantwortet hast.
Funktioniert alles wunderbar, danke dafür schon mal.
Dein Code macht genau das was ich gerne hätte.

Ein Problem gibt es aber noch.
Sonderzeichen werden ",,"

xxx-166B-xxx von Schr„nken.DOC
xxx-172A-Allg_S„ubern-xxxx.DOC​

Aber ansonsten klappt alles sehr gut. Danke nochmals.

LG Tischbank
 
Zuletzt bearbeitet:
Das liegt am Zeichensatz. Liste die Dateien am einfachsten ebenso in der Powershell (funktioniert als Powershell Script fast genauso wie in der Batch via
Code:
dir -recurse "pfad" > "ausgabe.txt"
), dann stimmt das Encoding. Evtl. sonst mal versuchen in der Batch-Datei auf Unicode umzustellen mittels chcp 65001.

Ein reiner Powershell-Ansatz wäre aber wohl eleganter:
Code:
# Pfade
$paths = @(
    $env:ProgramFiles,
    ${env:ProgramFiles(x86)}
    $env:USERPROFILE
)
$filter = "*.jpg","*.png" # Dateitypen
$outfile = "abc.txt" # falls Ausgabe in Datei

$files = @()
$NaturalSort = { [regex]::Replace( $_, '\d+', {$args[0].Value.PadLeft( 20 )}) }

# Dateien sammeln
$paths | % {
    $path = $_

    $files += gci -Recurse -Include $filter $path
}

# Ausgabe
#Remove-Item $outfile # falls Ausgabe in Datei
$files | sort $NaturalSort | % {
    $file = $_

    echo $file.FullName
    #echo $file.FullName | Out-File -FilePath $outfile -Append # falls Ausgabe in Datei
}
 
Vielen Dank.
Hat alles geklappt mit Power Shell.

Danke nochmals.

Lg Tischbank
 
Zurück
Oben