Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Plaintext nach Spalten sortieren

Frage Entwicklung VB for Applications

Mitglied: Gurkenhobel

Gurkenhobel (Level 1) - Jetzt verbinden

30.09.2012, aktualisiert 17:04 Uhr, 3074 Aufrufe, 15 Kommentare

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:

01.
08312 Karl Heinz Schneider 
02.
04661 Rita Lange 
03.
00799 Emil Kurz 
04.
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
01.
... Drommel 
02.
... Kurz 
03.
... Lange 
04.
... 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
Mitglied: 60730
30.09.2012, aktualisiert um 20:24 Uhr
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?)
Bitte warten ..
Mitglied: Gurkenhobel
01.10.2012 um 12:52 Uhr
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).
Bitte warten ..
Mitglied: 60730
01.10.2012, aktualisiert um 13:05 Uhr
[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]
Bitte warten ..
Mitglied: TsukiSan
01.10.2012 um 14:08 Uhr
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
Bitte warten ..
Mitglied: bastla
01.10.2012 um 14:44 Uhr
[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]
Bitte warten ..
Mitglied: bastla
01.10.2012, aktualisiert um 14:48 Uhr
@ 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
Bitte warten ..
Mitglied: TsukiSan
01.10.2012 um 15:06 Uhr
@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
Bitte warten ..
Mitglied: Gurkenhobel
02.10.2012, aktualisiert um 07:12 Uhr
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 ?

01.
 
02.
Const adVarChar = 200 
03.
Const MaxCharacters = 255 
04.
Const adFldIsNullable = 32 
05.
 
06.
Set DataList = CreateObject("ADOR.Recordset") 
07.
 
08.
DataList.Fields.Append "LineText", adVarChar, MaxCharacters, adFldIsNullable 
09.
DataList.Fields.Append "SortCharacter", adVarChar, MaxCharacters, adFldIsNullable 
10.
DataList.Open 
11.
 
12.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
13.
Set objFile = objFSO.OpenTextFile("Eingabe.txt", ForReading) 
14.
 
15.
Do Until objFile.AtEndOfStream 
16.
    strLine = objFile.ReadLine ' zeilenweises Einlesen 
17.
    arrFields = Split(strLine, " ") ' Leerzeichen als Delimiter=Trenner 
18.
    strCharacter = arrFields(2) ' ein 3. Array hat JEDER Datensatz 
19.
    ' bei 3 kommt Fehler 
20.
 
21.
    DataList.AddNew 
22.
    DataList("LineText") = strLine 
23.
    DataList("SortCharacter") = strCharacter 
24.
    DataList.Update 
25.
Loop 
26.
 
27.
objFile.Close 
28.
 
29.
DataList.Sort = "SortCharacter, LineText" 
30.
 
31.
Set objFile = objFSO.CreateTextFile("Ausgabe.txt", For Writing) 
32.
 
33.
Do Until DataList.EOF 
34.
    objFile.WriteLine DataList.Fields.Item("LineText") 
35.
    DataList.MoveNext 
36.
Loop 
37.
 
38.
objFile.Close 
39.
 
40.
Set objFSO = Nothing 
41.
Set objFile = Nothing 
42.
 
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
Bitte warten ..
Mitglied: TsukiSan
02.10.2012 um 09:43 Uhr
Hallo Micha,

na nach bloddy Newbie sieht dein Script aber nicht aus

Testenhalber könntest du Zeile 18 deines Scriptes mal so schreiben:
01.
strCharacter = arrFields(Ubound(arrFields))
Geht es eventuell dann?

Muss gleich wieder weg.

Viele Grüße

Tsuki
Bitte warten ..
Mitglied: Gurkenhobel
02.10.2012, aktualisiert um 13:44 Uhr
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
Bitte warten ..
Mitglied: TsukiSan
02.10.2012 um 14:26 Uhr
doitashimashite, Micha

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
Bitte warten ..
Mitglied: bastla
02.10.2012, aktualisiert um 15:16 Uhr
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
Bitte warten ..
Mitglied: Gurkenhobel
03.10.2012 um 15:18 Uhr
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
Bitte warten ..
Mitglied: bastla
03.10.2012, aktualisiert 04.10.2012
Hallo Gurkenhobel!

Da die "Datensätze" ja sortiert sind, brauchst Du nur jeweils eine Zeile mit der vorhergehenden zu vergleichen - ungetestet etwa so:
01.
Do Until DataList.EOF 
02.
    Zeile = DataList.Fields.Item("LineText") 
03.
    If Zeile <> VorigeZeile Then objFile.WriteLine Zeile 
04.
    'alternativ ohne Berücksichtigung von Groß-/Kleinschreibung: 
05.
    'If LCase(Zeile) <> LCase(VorigeZeile) Then objFile.WriteLine Zeile 
06.
    VorigeZeile = Zeile 
07.
    DataList.MoveNext  
08.
Loop
Grüße
bastla
Bitte warten ..
Mitglied: Gurkenhobel
03.10.2012 um 16:11 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
VB for Applications
gelöst Spalten nach Titel sortieren (2)

Frage von Anrion zum Thema VB for Applications ...

Microsoft Office
Excel 2016 anzeige der markierten Spalten (1)

Frage von endurance zum Thema Microsoft Office ...

Datenbanken
MySQL: Zwei Spalten in einer View zählen (11)

Frage von Memo66 zum Thema Datenbanken ...

Heiß diskutierte Inhalte
DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (9)

Frage von JayyyH zum Thema Switche und Hubs ...

Backup
Clients als Server missbrauchen? (9)

Frage von 1410640014 zum Thema Backup ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...