power-poler
Goto Top

Zeilen aus Text Datei nach Datum und Uhrzeit sortieren lassen

Abend,
Habe eine txt Datei mit rund 87000 Zeilen (bitte fragt nicht wo ich die her habe, brauche es für die schule).
Diese möchte ich jetzt nach Datum und Uhrzeit sortieren, weil die Werte zufällig verteilt sind.
Fängt mit 2004 an, geht dan 3 Monate 2005 und dan wider 2004 usw, alles unregelmäßig.

So sehen ein paar Beispiel Zeilen aus:
 0:02:51	 1.01.2005	      0,80	    216,21	      0,08	     88,03	      4,12	     11,00	    -21,94
12:53:47	 5.01.2005	      1,29	    201,42	      0,09	     85,23	      1,57	     10,92	     12,97
22:12:48	21.12.2004	      0,23	    137,08	      0,08	     83,67	     -2,56	     11,26	    -26,11

Nach langem hin und her, habe ich es nun endlich hin bekommen, das zumindest Datum und Uhrzeit in einer einheitlichen vorm vorliegen:

00:02:51	01.01.2005	      0,80	    216,21	      0,08	     88,03	      4,12	     11,00	    -21,94
12:53:47	05.01.2005	      1,29	    201,42	      0,09	     85,23	      1,57	     10,92	     12,97
22:12:48	21.12.2004	      0,23	    137,08	      0,08	     83,67	     -2,56	     11,26	    -26,11

Es handelt sich jeweils um 3 Zeilen, irgendwie wurde ein Zeilenumbruch eingefügt, der nicht da ist.
Also die erste null bei einstelligen werten wurde ergänzt.
Jetzt hänge ich daran, die werte sortiert wider in einer txt Datei abzulegen.
Das Sortieren kann gerne mehre Stunden dauern, ist mir relativ egal, muss nur einmal durchlaufen werden, sollte dan aber auch schon gleich das richtige Ergebnis liefern.
Die Zeilen werden folgendermaßen eingelesen:

			BufferedReader in = new BufferedReader(new FileReader("Pfad"));  
			String zeile = null;
			String str = "";  
			String str1 = "";  
			String str2 = "";  
			while ((zeile = in.readLine()) != null) {
               str = zeile.substring(0, 20);
               
               
                StringTokenizer s = new StringTokenizer(str, "	", false);  

                
				int i;
				

				i = 0;
				
				while(s.hasMoreTokens()) {
	                str1 = s.nextToken();
	                str2 = s.nextToken();
					System.out.println(str2 + " " + str1);  

unten das mit str1 und 2 war ein versuch die werte andersherum anzuordnen, also falls das lohnenswert ist, dies liegt bereits vor.
Am Ende soll aber die gesamte Zeile in einer neuen txt Datei stehen.
Hoffentlich kann mir da einer von euch helfen.
zerbrüte mir seit Stunden den Kopf über dieser Datei.

Schonmal Danke für eine Antwort
Mfg
Power-Poler

Content-Key: 205015

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

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

Member: christianlindloff
christianlindloff Apr 15, 2013 at 17:33:53 (UTC)
Goto Top
Hallo Power Poler,

Ich habe leider keine Ahnung vom Programmieren. Aber eine andere Idee wäre es die Daten in eine Excel Tabelle zu kopieren und dort weiter aus zu werten.

Liebe Grüße
Christian
Member: Power-Poler
Power-Poler Apr 15, 2013 at 17:47:41 (UTC)
Goto Top
Das ist genau mein Problem, wenn ich Excel (ObenOffice Version) die Daten gebe, werden sie nicht richtig von einander getrennt in spalten abgelegt.
Uhrzeit und Datum Stehen in einer Spalte und der Rest immer so mit 5 Spalten Abstand zueinander dahinter.
Außerdem wüste ich nicht, wie ich dort einen Anweisung gegen kann zur Sortierung der Daten.
Achso, brächte von einer Zeile sowiso nur die Werte:
Datum
Uhrzeit
und den dritten wert von rechts, der Rest kann, wenn möglich gleich raus gefiltert werden.
Mitglied: 76109
76109 Apr 15, 2013 at 18:24:32 (UTC)
Goto Top
Hallo Power-Poler!

Ersetze alle Leerzeichen durch "", dann bleiben nur noch Tabs als Trennzeichen übrigface-wink

Gruß Dieter
Member: Power-Poler
Power-Poler Apr 15, 2013 at 18:33:11 (UTC)
Goto Top
Den zustand habe ich jetzt, aber OpenOffice kann damit nichts anfangen.
Auch sortiert bekomme ich sie in OpenOffice nicht.
Mitglied: 64748
64748 Apr 15, 2013 updated at 18:38:49 (UTC)
Goto Top
Guten Abend,

hast Du denn eine Vorgabe, womit Du das machen sollst?

Sinnvoll ist wie christianlindloff oben schreibt Excel wenn man es denn unter Windows macht.

Oder man hat Linux und macht es mit Perl (oder einer anderen Skriptsprache).

Das Vorgehen ist klar, zunächst sorge dafür, dass jeder Datensatz in eine Zeile kommt. Dann kannst Du das mit Excel öffnen. Du musst nur dafür sorgen, dass Excel weiß, welches Zeichen als Trenner zwischen den Spalten zu nehmen ist.

Ich hab mir das gerade mal im Editor angesehen, im Moment sind zwischen den Spalten immer genau ein Tab gefolgt von mehreren Leerzeichen. Sinnvoll wäre es, zunächst
sed -n 's/\t\ \+/;/g' < Dateinname
(geht auch im Editor (kommt auf den Editor an)) diese Zeichen durch Semikolon zu ersetzen, das wird von Excel problemlos als Spaltentrenner verarbeitet.

Sortieren in Excel kannst Du nach einer beliebigen Spalte, also hier die zweite.

Markus

PS: das geht auch mit OpenOffice
Member: Power-Poler
Power-Poler Apr 15, 2013 at 18:49:37 (UTC)
Goto Top
habe jetzt eine Batch erstellt mit dem Inhalt:
@echo off &setlocal

sed -n 's/\t\ \+/;/g' < G.txt
pause
bekomme jedoch jetzt eine Fehlermeldung das sed unbekannt wäre. "Der Befehl "sed" ist entweder falsch geschrieben oder
konnte nicht gefunden werden.
Drücken Sie eine beliebige Taste . . ."

Sorry falls ich dich falsch verstanden habe.

Habe jetzt Notepad++ gemacht (hat auch schon ewisch gedauert) OpenOffice öffnet es jetzt normal.
Wie kann ich jetzt in OpenOffice die Werte sortieren lassen?
Mitglied: 64748
64748 Apr 15, 2013 at 18:58:22 (UTC)
Goto Top
Das ist auch für Linux, sed ist der stream-Editor. Sowas gibt's in Windows nicht. Von Batch hab ich keine Ahnung.

Wenn Du einen Editor hast, der mit Regulären Ausdrücken umgehen kann, dann kannst Du mit dem Code
s/\t\ \+/;/g
diese Ersetzung in der Datei machen. Das geht aber auch in jedem anderen Editor.

Markus
Member: bastla
bastla Apr 15, 2013 at 19:33:28 (UTC)
Goto Top
@ hmarkus
Sowas gibt's in Windows nicht.
... aber natürlich für Windows, zB http://gnuwin32.sourceforge.net/packages/sed.htm

Grüße
bastla
Mitglied: 64748
64748 Apr 15, 2013 at 19:52:43 (UTC)
Goto Top
Ja klar, ich entsinne mich, dass wir vor einigen Wochen einen Thread hatten, wo sed.exe nicht wie erwartet funktionierte. Ich hab vor einigen Tagen mal mobaxterm ausprobiert, das basiert auf cygwin und stellt ein Linux-Terminal in Windows zur Verfügung. Sehr empfehlenswert.

Danke @bastla für den Hinweis.

Markus
Mitglied: 64748
64748 Apr 15, 2013 at 19:57:44 (UTC)
Goto Top
Habe jetzt Notepad++ gemacht (hat auch schon ewisch gedauert) OpenOffice öffnet es jetzt normal.
Wie kann ich jetzt in OpenOffice die Werte sortieren lassen?
Daten -> Sortieren.... und dann den Schlüssel wählen.

Markus
Mitglied: 64748
64748 Apr 15, 2013, updated at Apr 16, 2013 at 07:58:27 (UTC)
Goto Top
Hier noch ein Einzeiler in mehreren Zeilen face-wink
sed -n 's/\t\+\ \+/;/gp' < text.txt | 
sed 's/;\([0-9]\)\(.[0-9\{2\}.[0-9]\{4\}\)/\ 0\1\2/p' | 
uniq | 
sed -n 's/\([0-9]\{1,2\}\).\([0-9]\{2\}\).\([0-9]\{4\}\)/\3.\2.\1/p' | 
sort -t ';' -k 2 | 
sed -n 's/\([0-9]\{4\}\).\([0-9]\{2\}\).\([0-9]\{2\}\)/\3.\2.\1/p'

dabei ist text.txt die Datei mit den Daten. Es funktioniert nach dem Prinzip der Schwartz-Transformation. Nach dem Ersetzen von Tabs uns Leerzeichen durch Semikolon werden zunächst im Datum alle Tage zweistellig gemacht.
Danach werden tag/monat/jahr in jahr/monat/tag vertauscht.
Dann wird nach dem zweiten Feld sortiert.
Und im letzten Schritt die Vertauschung im Datum wieder Rückgängig gemacht.

Sollte auch in cygwin oder mobaxterm auf Windows laufen.

Markus

Edit: in mobaxterm muss man es anders schreiben. Z.B. im ersten Ausdruck [\t ]* für eine Folge von Tabs oder/und Leerzeichen.