gurkenhobel
Goto Top

Textdatei zeilenweise nach Datum sortieren

Hallo Gemeinde,

mehrere umfangreiche Textdateien, in denen zeilenweise wichtige Daten und Termine eingetragen sind, sollen zeilenweise nach dem Datum sortiert und in eine neue Texdatei geschrieben werden.
Das besondere an der Datumssortierung ist die sogenannten Chroniksortierung, d.h. zuerst nach dem Monat (Stelle 4-5), dann nach dem Wochentag (1-2) und zuletzt nach dem Jahr (Stellen 7-10).
Das Datum im deutschen Format (TT.MM.JJJJ - mit führenden Nullen) steht immer an erster Stelle, nach einem Leerzeichen folgt der eigentliche Text.

Beim Googeln habe ich zwar einige Lösungen in PHP, Perl oder für Linux gesehen, ich hätte aber gerne ein Script in VBS. Ich danke im voraus.

Content-Key: 257056

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

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

Member: colinardo
Solution colinardo Dec 08, 2014 updated at 17:28:26 (UTC)
Goto Top
Hallo Gurkenhobel,
probiers mal hiermit:
'Konstanten  
Const FILE_IN = "C:\termine.txt"  
Const FILE_OUT = "C:\termine_sortiert.txt"   
Const AD_LONGCHAR = 201
Const AD_INT = 3
'Variablen  
Dim strNewContent,arrContent,fso,objList,line,strDate,f_out
'Objekte  
Set objList = CreateObject("ADOR.Recordset")  
Set fso = CreateObject("Scripting.Filesystemobject")  
'Spalten des Recordsets erstellen  
objList.Fields.Append "DD", AD_INT  
objList.Fields.Append "MM", AD_INT  
objList.Fields.Append "YYYY", AD_INT  
objList.Fields.Append "Text", AD_LONGCHAR,1  
objList.Open
'Datei in Array einlesen  
arrContent = Split(fso.OpenTextFile(FILE_IN,1).ReadAll(),vbNewLine)
'Für jede Zeile im Array einen Eintrag im Recordset hinzufügen  
For Each line In arrContent
	If line <> "" Then  
		objList.AddNew
		objList("DD").Value = Left(line,2)  
		objList("MM").Value = Mid(line,4,2)  
		objList("YYYY").Value = Mid(line,7,4)  
		objList("Text").Value = line  
		objList.Update
	End If
Next
'Recordset sortieren  
objList.Sort = "MM ASC,DD ASC,YYYY ASC"  

'Recordset in Datei ausgeben  
Set f_out = fso.OpenTextFile(FILE_OUT,2,True)
objList.MoveFirst
While Not objList.EOF
	f_out.WriteLine objList("Text").Value  
	objList.MoveNext
Wend
f_out.Close

MsgBox "Finished"  

Set fso = Nothing
Set objList = Nothing
Grüße Uwe

-edit- kleinere Optimierungen
Member: Gurkenhobel
Gurkenhobel Dec 08, 2014 updated at 18:05:36 (UTC)
Goto Top
Hallo Uwe,

das ist genau das, was ich wollte - kurz und schmerzlos. Besonders freut es mich natürlich, daß auch längere Zeilen mit meh als 256 Zeichen nicht abgeschnitten werden.
Die Zeile 13 <code type="plain>objList.Fields.Append "Text", 200,256 hat da wohl keinen Einfluss...

Vielen Dank und beste Grüße

Micha