Top-Themen

Aktuelle Themen (A bis Z)

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, 3145 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 ..
Ähnliche Inhalte
VB for Applications
Spalten nach Titel sortieren
gelöst Frage von AnrionVB for Applications2 Kommentare

Hallo Community, Ich bin auf der Suche nach einem Makro, welches mir es ermöglicht, die Spalten zu sortieren. In ...

Microsoft Office
Excel Tabelle nach Spalte sortieren und Daten auf Tabellenblätter separieren
gelöst Frage von FastinatorMicrosoft Office4 Kommentare

Guten Tag zusammen, man hat mich vor die Aufgabe gestellt, eine .CSV-Datei in Excel (Microsoft Office 2010) so umzubauen, ...

Microsoft Office
Excel Makro zum Sortieren von Spalten an größeres Dokument Anpassen
gelöst Frage von RolforMicrosoft Office2 Kommentare

Hi, Ich habe leider nicht viel Erfahrung mit VB-Makros für Excel und habe zum Sortieren von Spalten in einem ...

Datenbanken
SQL - Spalten sortieren bzw. Reihenfolge ändern
gelöst Frage von EisbrecherinDatenbanken2 Kommentare

Hallo zusammen, ich habe eine SQL Tabelle mit unter anderem folgenden Spalten: NoteID, tmpNote1, tmpDim1, tmpNote2, tmpDim2, tmpNote3, tmpDim3, ...

Neue Wissensbeiträge
Microsoft Office

Office 2010 Starter wieder installieren auf einer frischen Windows-Installation

Tipp von Lochkartenstanzer vor 12 StundenMicrosoft Office

Moin, vor ein paar Tagen schlug bei mir ein Kunde auf, der sein Widnows 7 geschrottet und es inklusive ...

Datenbanken

Upgrade MongoDB 3.4 auf 3.6

Erfahrungsbericht von Frank vor 14 StundenDatenbanken

Seit kurzem gibt es das 3.6 Update für die MongoDB: Sicherheit, das Sortieren, Aggregation und auch die Performance wurde ...

SAN, NAS, DAS

Backdoor Zugang und Upload-Bug in vielen Western Digital MyCloud Geräten

Information von Frank vor 15 StundenSAN, NAS, DAS2 Kommentare

James Bercegay von der Firma Gulftech hat die Fehler an Western Digital gemeldet und das Unternehmen stellt bereits ein ...

Microsoft Office

Outlook 2016 - Beim Weiterleiten keine PDF Anhänge mehr - KB4011626 entfernen

Erfahrungsbericht von Deepsys vor 18 StundenMicrosoft Office1 Kommentar

Wenn ihr feststellt das ihr beim Weiterleiten von E-Mails keine PDF Anhänge mehr versendent, dann dankt Microsoft. Diese tolle ...

Heiß diskutierte Inhalte
Windows Netzwerk
Drucker isolieren in Windows Domäne
gelöst Frage von lcer00Windows Netzwerk14 Kommentare

Hallo zusammen, habe eine Windows-AD (2012R2) in der es einen Druckerserver gibt. Mittlerweile verliere ich das Vertrauen in die ...

Server-Hardware
Veeam Backup Server stürzt alle paar Tage ab
Frage von Leo-leServer-Hardware11 Kommentare

Hallo Forum, ich habe momentan folgendes Problem. Veeam Backup and Replication 9.5 u2 auf voll gepatchten DL 380 G7 ...

Windows 10
Win10 Laptop findet keine Netzwerkgeräte und Freigaben mehr
Frage von CoolzeroWindows 1010 Kommentare

Hi, seit ein paar Tagen habe ich das Problem das mein Windows 10 Laptop keine Geräte mehr in der ...

Batch & Shell
Dateien verschieben mit batch
gelöst Frage von michi-ffmBatch & Shell10 Kommentare

Hallo Zusammen hat jemand evtl eine Idee? Zunächst hier das Skript: Leider werden keine UNC-Pfade unterstüzt, kann mir jemand ...