gurkenhobel
Goto Top

Plaintext nach Spalten sortieren

Ich weiß mal wieder nicht mehr weiter und bitte um Hilfe

Ich habe mehrere Textdateien ("Plaintext"), in der Zeilenweise Datensätze (z.B. Namen und Personennummern) eingetragen sind. Wie kann ich diese mit Windows-Mitteln (VBS/WSH) schnell sortieren. z.B. sieht eine solche Personenliste wiefolgt aus:

08312 Karl Heinz Schneider
04661 Rita Lange
00799 Emil Kurz
03122 Hans Georg Drommel
Wie kann man diese Liste (zwischen den einzelnen 'Spalten' ist also immer ein Leerzeichen) so sortieren,
daß die neue Reihenfolge also
... Drommel
... Kurz
... Lange
... Schneider
wird. Sortieren nach dem letzten Wert.

Eigentlich sehr simpel, aber ich komme nicht darauf. Wahrscheinlich irgendein Array auslesen.
Danke und einen schönen Sonntag

Micha

Content-Key: 192036

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

Printed on: April 19, 2024 at 00:04 o'clock

Mitglied: 60730
60730 Sep 30, 2012 updated at 18:24:34 (UTC)
Goto Top
Auch dir nen netten gruss

ein haufen zeichen in einer zeile und das letzte soll der sortierer werden
Und das alles in vba...

Da gibts soch was von ratiosoft, nennt sich excel.

Hast du dir mal die muehe gemacht und dir emil und rita anzusehen?
Wenn nein, dann schau mal was die anderen anders macht.
Dir gehts ja um den nachnamen, nicht um den vornamen...

Was ist uebrigens ueberhaupt das ziel der reise?
Gaebe es die zeilen auch mit einem " sonst nicht" verwendeten zeichen als trenner?

(und warum steht da oben 144 aufrufe und nur eine antwort?)
Member: Gurkenhobel
Gurkenhobel Oct 01, 2012 at 10:52:18 (UTC)
Goto Top
Zitat von @60730:
Und das alles in vba...
Nein, ich möchte es nicht als vba-Makro sondern als vbs/wsh-Script für die Betriebssstem-Ebene (oder Konsole).

Da gibts soch was von ratiosoft, nennt sich excel.
Ja, ich könnte den Text importieren und dann in Spalten aufteilen (bei zwei Vornamen allerhand Handarbeit) und ihn dann nach der letzten Spalte sortieren lassen.
WENN ICH ABER GAR KEINE EXCEL HABE :-]
Hast du dir mal die muehe gemacht und dir emil und rita anzusehen?
Wenn nein, dann schau mal was die anderen anders macht.
Dir gehts ja um den nachnamen, nicht um den vornamen...
Mir fällt an Emil und Rita nur auf, dass sie nur einen Vornamen haben...
Was ist uebrigens ueberhaupt das ziel der reise?
Das Ziel der Reise ist nicht der Weg, sondern eine Weiterverarbeitung der Daten
Gaebe es die zeilen auch mit einem " sonst nicht" verwendeten zeichen als trenner?
Man könnte natürlich mit einem Textprogramm die Leerzeichen durch Semikola ersetzen - aber eigentlich ist es doch egal ob man im Script schreibt " " oder ";"
(und warum steht da oben 144 aufrufe und nur eine antwort?)
Warum weiß keiner ..., zwischenzeitlich hat sich die Zahl der Aufrufe sogar mehr als verdoppelt (312).
Mitglied: 60730
60730 Oct 01, 2012 updated at 11:05:22 (UTC)
Goto Top
[OT]
Man könnte natürlich mit einem Textprogramm die Leerzeichen durch Semikola ersetzen - aber eigentlich ist es doch egal ob man im Script schreibt " " oder ";"

mir fällt an Emil und Rita nur auf, dass sie nur einen Vornamen haben...
(Wieviele "Felder" haben die dann und wieviel die anderen?)

Das Ziel der Reise ist nicht der Weg, sondern eine Weiterverarbeitung der Daten

Einem Programm ist es Jacke wie Hose, ob das sortiert nach Buxte oder Hude werkelt
Aber wer an einer Exportdatei rumfummelt, um die dann weiterzuverarbeiten, der sollte mal nach ner Jacke schauen, die die Ärmel hinten hat.


Warum weiß keiner ..., zwischenzeitlich hat sich die Zahl der Aufrufe sogar mehr als verdoppelt (312).

Nennt mich "keiner"
"Manche" ahnen besser als ich, wann Hopfen und Malz verloren ist.
[/OT]
Member: TsukiSan
TsukiSan Oct 01, 2012 at 12:08:28 (UTC)
Goto Top
Hallo Micha (um hier mal eine Begrüßung in den Raum zu werfen!),

wenn du das Sortieren so wie in deinem Fall vor hast,
dann musst du in 5 Schritten vorgehen:
1) Datei einlesen (zeilenweise)und jede Zeile in einzelne Arrays teilen
2) Die einzlenen Arrays tauschen (LBound mit UBound)
3) Mittels Sortierroutine (das kann Quicksort oder Bubblesort etc. sein)
diese Arrays sortieren, wie du es brauchst
4) dann wieder zeilenweise die Arrays zurücktauschen
5) alles in deine neue Datei schreiben.

So, alles was LimboSeil meint ist, warum man die Exportdatei nicht schon so anpassen kann, dass alles entsprechend sortiert ist.

Hast du denn schon Scriptansätze? Wir kauen hier ungern vor. Der erste Schritt muss von dir kommen, dann wird dir auch geholfen, wenn's irgendwo klemmt. Fertige Scripte schreiben nur die wenigsten. Is no fun at all!

Grüsse

Tsuki
Member: bastla
bastla Oct 01, 2012 at 12:44:24 (UTC)
Goto Top
[OT] @ Limbo
"Manche" ahnen besser als ich, wann Hopfen und Malz verloren ist.
Und nach
aber eigentlich ist es doch egal ob man im Script schreibt " " oder ";"
dürfte es wohl nicht mehr nur "Ahnung" sein ...

Grüße
bastla
[/OT]
Member: bastla
bastla Oct 01, 2012 updated at 12:48:41 (UTC)
Goto Top
@ Tsuki
Wenn Du alles über ein "disconnected recordset" abwickelst (wie neulich zB hier), entfallen Tauschereien und Sortier-Algorithmen - aber ohne eindeutig identifizierbare Felder macht's so oder so keinen Sinn ...

Grüße
bastla
Member: TsukiSan
TsukiSan Oct 01, 2012 at 13:06:12 (UTC)
Goto Top
@bastla,
aber ohne eindeutig identifizierbare Felder macht's so oder so keinen Sinn
Yepp, das ist das eigentliche Problem auf das LimboSeil schon hingewiesen hat. Sonst ginge nämlich auch ein 2-dimensionales Array nach beliebiger Spalte zu sortieren

Grüsse
Tsuki
Member: Gurkenhobel
Gurkenhobel Oct 02, 2012 updated at 05:12:44 (UTC)
Goto Top
Zitat von @TsukiSan:

Hast du denn schon Scriptansätze? Wir kauen hier ungern vor. Der erste Schritt muss von dir kommen, dann wird dir auch
geholfen, wenn's irgendwo klemmt. Fertige Scripte schreiben nur die wenigsten. Is no fun at all!

Hallo Tsuki und danke für deine konkrete Antwort.
Als bloody Newbie habe ich ein gefundenes Script etwas angepaßt. Bei gleicher Anzahl von Array-Feldern funktioniert das ja auch, aber es sind ja unterschiedliche "Spalten"-Anzahlen (bedingt durch die Doppel-Vornamen). Kann man so einen Datensatz nicht herumdrehen d.h. wortweise von hinten lesen und danach sortieren ?

Const adVarChar = 200
Const MaxCharacters = 255
Const adFldIsNullable = 32

Set DataList = CreateObject("ADOR.Recordset")  

DataList.Fields.Append "LineText", adVarChar, MaxCharacters, adFldIsNullable  
DataList.Fields.Append "SortCharacter", adVarChar, MaxCharacters, adFldIsNullable  
DataList.Open

Set objFSO = CreateObject("Scripting.FileSystemObject")  
Set objFile = objFSO.OpenTextFile("Eingabe.txt", ForReading)  

Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine ' zeilenweises Einlesen  
    arrFields = Split(strLine, " ") ' Leerzeichen als Delimiter=Trenner  
    strCharacter = arrFields(2) ' ein 3. Array hat JEDER Datensatz  
    ' bei 3 kommt Fehler  

    DataList.AddNew
    DataList("LineText") = strLine  
    DataList("SortCharacter") = strCharacter  
    DataList.Update
Loop

objFile.Close

DataList.Sort = "SortCharacter, LineText"  

Set objFile = objFSO.CreateTextFile("Ausgabe.txt", For Writing)  

Do Until DataList.EOF
    objFile.WriteLine DataList.Fields.Item("LineText")  
    DataList.MoveNext
Loop

objFile.Close

Set objFSO = Nothing
Set objFile = Nothing

Wie gesagt, was anderes habe ich nicht und die Punkte 2 bis 4 Deines Vorschlages sind mir als Neuling auch ziemlich fremd. Ich muss mich da schon etwas tiefer in die Materie ARRAY einarbeiten. Sry und danke erst einmal

Grüsse

Micha
Member: TsukiSan
TsukiSan Oct 02, 2012 at 07:43:58 (UTC)
Goto Top
Hallo Micha,

na nach bloddy Newbie sieht dein Script aber nicht aus face-wink

Testenhalber könntest du Zeile 18 deines Scriptes mal so schreiben:
strCharacter = arrFields(Ubound(arrFields))

Geht es eventuell dann?

Muss gleich wieder weg.

Viele Grüße

Tsuki
Member: Gurkenhobel
Gurkenhobel Oct 02, 2012 updated at 11:44:50 (UTC)
Goto Top
Hallo Tsuki

Domo arigato,
ja das isses. Das Script funktioniert so wie ich es wollte und ich danke herzlichst für Deine Mühe. Wieder mal was gelernt.
Ein kleiner Makel besteht bestand allerdings. Wenn im letzten Arrayfeld ein Datensatz am Ende ein Leerzeichen hat, wertet das Script dies als letztes Arrayfeld aus und diese Datensätze wandern dann an die Spitze der Ausgabedatei. Also sorgt Rtrim dafür das das nicht passiert.

In Zeile 16 steht nun
strLine = rtrim(objFile.ReadLine)
Danke und Tschüs

Micha

PS. Das Script stammt vom Scripting Guy
Member: TsukiSan
TsukiSan Oct 02, 2012 at 12:26:17 (UTC)
Goto Top
doitashimashite, Micha face-wink

dein Script war doch schon auf dem richtigen Weg. Und hätte man es am Anfang deiner Frage gleich mit hingeschrieben, hätte eventuell LimboSeil die Stelle "hervorgehoben". Na und bastla sowieso!

Die Trim-Funktion am Ende kann natürlich nicht schaden. Das ist auch ok!

Fehlt jetzt nur noch der umweltgrüne Haken ganz oben.

Viele Grüße

Tsuki
Member: bastla
bastla Oct 02, 2012 updated at 13:16:14 (UTC)
Goto Top
Fehlt jetzt nur noch ...
... (zumindest für das nächste Mal) eine venünftige Struktur der Daten - Zeichen, die in einem Feld vorkommen können (hier: Leerzeichen) stellen nun mal keine brauchbaren Trennzeichen dar, und die daraus resultierenden "Datensätze" mit unterschiedlicher Feldanzahl lassen sich bestenfalls auf einen Spezialfall wie hier eingeschränkt verarbeiten ...

Letzte Anmerkung: Im Zweifelsfall würde ich zumindest noch einer Leerzeile am Ende der Textdatei vorbeugen, indem der Rest nach
strLine = Trim(objFile.ReadLine) ' zeilenweises Einlesen
(führende Leerzeichen würde ich ebenfalls nicht für gewollt halten) nur bei positivem Ergebnis der Abfrage
If strLine <> "" Then
ausgeführt wird ...

Grüße
bastla
Member: Gurkenhobel
Gurkenhobel Oct 03, 2012 at 13:18:23 (UTC)
Goto Top
Hallo,
Grüße und danke an alle an diesem Thread Beteiligten
tut mir leid, daß ich mich nicht konkret genug ausgedruckst habe.

@bastla danke für die Leerzeilen-Eliminierung-Anregung (wurde inzwischen eingebaut).

Bevor ich einen neuen Thread starte noch eine Frage:
da ich das Script abgewandelt auch für andere Textfiles einsetzen werde (z.B. das von mir oben gepostete) möchte ich vermeiden, dass Datensätze doppelt vorhanden sind. Also würde ich bei der fertigen Ausgabedatei noch eine Prüfung auf hintereinander vorkommende Datensätze machen wollen.
Wie kan man das anstellen ?

Danke erscht amoal und einen schönen Feirtag noch..

Micha
Member: bastla
bastla Oct 03, 2012, updated at Oct 04, 2012 at 06:23:37 (UTC)
Goto Top
Hallo Gurkenhobel!

Da die "Datensätze" ja sortiert sind, brauchst Du nur jeweils eine Zeile mit der vorhergehenden zu vergleichen - ungetestet etwa so:
Do Until DataList.EOF
    Zeile = DataList.Fields.Item("LineText")  
    If Zeile <> VorigeZeile Then objFile.WriteLine Zeile
    'alternativ ohne Berücksichtigung von Groß-/Kleinschreibung:  
    'If LCase(Zeile) <> LCase(VorigeZeile) Then objFile.WriteLine Zeile  
    VorigeZeile = Zeile
    DataList.MoveNext 
Loop
Grüße
bastla
Member: Gurkenhobel
Gurkenhobel Oct 03, 2012 at 14:11:07 (UTC)
Goto Top
Hi bastla,

Ja genauso habe ich mir das vorgestellt :]in die Höhe hops.
Alles funktioniert zur vollsten Zufriedenheit. Ich habe mehrere Varianten ausprobiert und bin hellauf begeistert.
Und dabei habe ich wieder etwas dazugelernt. So trägt halt ein Forum immer dazu bei, das man sein Wissen kostenlos erweitern kann.

Und somit bedanke ich mich abschließend.

Tschüs

Micha