Entwickler-Ecke
Delphi Language (Object-Pascal) / CLX - Finden und sortieren von Strings
basner - Fr 29.05.09 11:01
Titel: Finden und sortieren von Strings
Hallo und guten Morgen.
Vielleicht habt ihr ja noch ein paar tolle Ideen, wie ich Bestimmte Strings finden kann zum Beispiel bestimmte Anzahlen von Zahlen oder Buchstaben. Ohne das ein Benutzer irgendwie was eingeben muss. Das ganze findet in einer RichEdit statt.
BenBE - Fr 29.05.09 11:04
Ich glaube, das geht mit Glaskugeln.
P.S.: Mit einer genauen Fragestellung erhält man genaue Antworten - das Gegenteil funktioniert analog ...
Gausi - Fr 29.05.09 11:08
Ich werfe einfach mal Pos und PosEx in den Raum. 8)
basner - Fr 29.05.09 11:09
Also der Text sieht wie folgt aus:
auto baum 12 essen fahren
Also es existieren Zahlen und Buchstaben. Zum Schluß soll es ungefair so aussehen:
auto;baum;12;essen;fahren;
und in einer anderen Richedit dargestellt werden.
Sorry wenn ich das Problem zu schlecht umschrieben habe.
BenBE - Fr 29.05.09 11:10
Also du willst finden, welche Wörter es im Text gibt?
Krischa - Fr 29.05.09 11:13
Also du kopierst den Text in einen String und Splittest ihn mit
Delphi-Quelltext
1:
| ExtractStrings([' '], [' '], PChar(deinstring),eineStringliste); |
er sollte jetzt nach Leerzeichen trennen. Jetzt hast du deinen gesplitteten Text in einer Stringlist. Nun kannst du die Elemente zu einem String zusammenfassen(mit gewünschten Trennzeichen) und in deiner Richedit ausgeben
basner - Fr 29.05.09 11:14
Genau sowie Zahlen und die nach einem bestimmten Schema sortieren. Wie zb: stehen 5 Zahlen hinter einander weiß ich das es eine PLZ ist oder nur eine dann eben die Nummerrierung.
Und einzeln Stehende Buchstaben sollen entfernt werden aus dem Text. Und die Einzelnen Werte durch ein Semikolon getrennt werden.
Also z.B:
1; Baum; 12345; Essen usw
BenBE - Fr 29.05.09 11:16
Wenn es eh leerzeichen sind:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8:
| SL := TStringList.Create; try SL.Duplicates := False; SL.CommaText := DeinText; OutputMemo.Lines.Text := SL.Text; finally SL.Free; end; |
P.S.: Hier Gausi, haste dein
Pos und
PosEx wieder ...
basner - Fr 29.05.09 11:23
Danke für die schnelle Hilfe. Wie bekomme ich die Einträge aber hinter einander?
---
Moderiert von
Narses: Beiträge zusammengefasst---
Oh. Habs hinbekommen:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7:
| Textaufbau := ''; PruefString := ''; eineStringliste.Add(RichEdit1.Text); for i := 0 to eineStringliste.Count -1 do begin Textaufbau := Textaufbau + eineStringliste[i]+';'; end; Richtextbox2.text := Textaufbau; |
Moderiert von
Narses: Code- durch Delphi-Tags ersetzt
basner - Fr 29.05.09 16:03
Hallo habe noch ein kleines Problem.
Ich habe nun den ganzen Text wie ich ihn haben wollte. Er sieht ungefair so aus.
1;Haus;Baum;lerzeichen leerzeichen;k;Ö;leerzeichen;Auto;2345987;k
Ich möchte nun noch die einzelnen Buchstaben und Leerzeichen komplett entfernen so das es nur Worte ab 3 zusammenhängenden Buchstaben gibt.
Das Ergebnis sollte dann dieses sein.
1;Haus;Baum;Auto;2345987;
ffgorcky - Fr 29.05.09 19:05
Du möchtest nur die Worte mit einer gewünschten Mindestlänge (also mindestens 3 Buchstaben lang) haben?
Das ginge (denke ich zumindest) doch am besten mit dem im Memo aufgeteilten Text:
Delphi-Quelltext
1: 2: 3:
| For i:=0 to OutputMemo.Lines.Count-1 do if Length(OutputMemo.Lines[i])<gewuenschteMindestlaenge then DelLine(OutputMemo,i); |
Wobei ich mir bei dem DelLine-Befehl gerade nicht so ganz sicher bin, ob der so klappt...
Marc. - Fr 29.05.09 19:15
Wenn dann würde ich die zu langen Strings bereits in der Stringlist rauswerfen. Das spart nämlich Performance gegenüber deiner Variante, da hier das Memo/Form nicht jedesmal neu gezeichnet werden muss. ;)
basner - Fr 29.05.09 19:21
Das hört sich sehr gut an. Nur das Problem ist das ich auch viele Redundante Daten in diesem Text habe und nur bestimmt Teile die sich innerhalb des Textes befinden benötige.
Mein Gedanke war es mit zwei Stringlisten zu probieren. Aber bin da leider noch zu frisch in Delphie.
ffgorcky - Sa 30.05.09 13:33
Für das redundante Daten (also wirklich gleiche Zeilen!) löschen fällt mir im Moment nur diese Lösung ein (bei meiner Aufspaltung in Memo-Text):
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13:
| procedure redundanteDatenLoeschen(); var i,j:Int; doppeltesGefunden:bool; begin for i:=0 to OutputMemo.Lines.Count-1 do for j:=0 to i-1 do if (not doppeltesGefunden)then if(OutputMemo.Lines[i]=OutputMemo.Lines[j]) then begin DelLine(OutputMemo,j); doppeltesGefunden:=true; end; end; |
Oder habe ich Dich jetzt falsch verstanden?
Also wäre das ganze mit meinem Vorschlag von Gestern dann so:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18: 19: 20: 21: 22:
| procedure redundanteUndZuKurzeZeilenLoeschen(); var i,j:Int; doppeltesGefunden:bool; begin For i:=0 to OutputMemo.Lines.Count-1 do begin doppeltesGefunden:=false; if Length(OutputMemo.Lines[i])<gewuenschteMindestlaenge then DelLine(OutputMemo,i) else for j:=0 to i-1 do if (not doppeltesGefunden)then if(OutputMemo.Lines[i]=OutputMemo.Lines[j]) then begin DelLine(OutputMemo,j); doppeltesGefunden:=true; end; end; end; |
Beim Finden eines redundanten Wertes weiß ich nur leider nicht, wie ich dann dort direkt die (innere!) for-Schlefe nach dem Lösch-Vorgang abbrechen kann, da der ja dann nicht noch einmal existieren kann!
Also kann ich das ganze dann nur durch die If-Abfrage verkürzen.
basner - Sa 30.05.09 16:35
Super. Und vielen Dank für die Hilfen, die man hier im Forum erhält.
Also ich weiß einen Startpunkt in einer Zeile und das Ende. Somit weiß ich nach bestimmten Kriterien was ich haben will. Und alles was zwischen den Zeichen ist möchte ich haben den Rest raus.
zB: So sieht es jetzt aus:
Auto.B ge f l Ü 1€-essen-gehen-234-toll hhdsd- hds
Und so soll es dann aussehen. Natürlich sind es mehrere Tausdend Datensätze.
1€-essen-gehen-234-toll
Vielleicht ist das jetzt eindeutiger was ich meine.
Lannes - Sa 30.05.09 18:27
Hallo,
wenn Du Start und Ende hast, dann so ähnlich:
Delphi-Quelltext
1:
| sErg := Copy(s,Start,Ende-Start); |
Aber ich werde irgendwie das Gefühl nicht los, das Du Deinen Text mehrmals durch die Mangel drehst.
Leerzeichen => ; => -
Könnte mir denken das es einfacher und direkter lösbar ist, da müsste man aber mehr Informationen zum Text haben.
basner - Sa 30.05.09 18:45
Das ist dieser Text. Die Steuerzeichen habe ich schon weg
Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9:
| µ03033€pˆ4€gˆ0321€2ˆ€kˆ @JMl µ03033€pˆ4€gˆ0321€2ˆ€kˆ @JMl
1Auto€ ‹audi AUTO ¶AUTO
1Auto€ ‹audi AUTO ¶AUTO von hier>>//1AUTO.€Xˆ AUTO€n AUTOXX€ –€n„ co€v–AUTO“ 986627 AUTO€o //<--Bis hier•12345678901“|½ 탦I âg 985þX½ 27 AUTO€o• þÕ¼ 234904€ Ü µ03033€pˆ4€gˆ0321€2ˆ€kˆ @JMl
1Auto€ ‹audi AUTO ¶AUTO 1‘ 98566ƒAUTO©4Ü µ012345ˆ 543210,543210þq¶ 27 AUTO€ • þ¸ › @@P€ ‰ƒ€ |
Lannes - Sa 30.05.09 19:03
Hallo,
das sind binär gespeicherte Daten(Datenbank?), welches Programm schreibt die Daten, eventuell kommt man über die Formatbeschreibung an die Datensätze. Ich denke durch entfernen von Steuerzeichen und anschließendes weiterverarbeiten handelst Du Dir nur Probleme ein.
basner - Sa 30.05.09 19:06
Die Datenbank wenn es denn eine ist kenne ich leider nicht. Ist schon zu lange her. Benötige nur die Daten. Vorher war es auch eine DAT Datei
BenBE - Sa 30.05.09 20:24
Bitte hänge einmal eine solche Datenbank-Datei an, damit man sich mal in einem Hex-Editor ein sinnvolles Bild von den Daten machen kann.
Ggf. wäre auch eine Beschreibung sinnvoll, was in den Daten "erwartet" wird an Informationen.
basner - Sa 30.05.09 21:15
Im Anhang habe ich so eine Dat(in TXT umgewandelt) Angehängt. Vielleicht hilft es. Habe Sie aber gekürzt. Sind sonst über 20 MB
Lannes - So 31.05.09 23:29
Hallo,
so wird das nichts, in Text umgewandelte Daten helfen nicht weiter.
Kannst Du die Datei nicht zippen oder anderweitig zum Downloaden zur Verfügung stellen.
basner - Mo 01.06.09 01:37
Leider ist das die Datei nur eben dat
---
Moderiert von
Narses: Beiträge zusammengefasst---
Ok hier ist die Datei gezipt. Ich bin für jede Idee dankbar
Lannes - Mo 01.06.09 11:09
Hallo,
:?
Lannes hat folgendes geschrieben : |
| so wird das nichts, in Text umgewandelte Daten helfen nicht weiter. |
Du hast die umgewandelten Daten gezippt, durch zippen werden die nicht brauchbarer.
Durch das umwandeln der Daten gehen wesentliche für die Analyse erforderliche Informationen verlorern.
Es werden die Original-Daten der Datenbankdatei *.DAT benötigt.
Und zur Erinnerung:
BenBE hat folgendes geschrieben : |
| Ggf. wäre auch eine Beschreibung sinnvoll, was in den Daten "erwartet" wird an Informationen. |
basner - Mo 01.06.09 23:49
Leider kann ich hier keine DAT Dateien anhängen.
Und die TXT sieht genauso aus wie die DAT
Lannes - Di 02.06.09 09:10
Hallo,
aber Du kannst die DAT-Datei zippen, Zip-Archive kannst Du hier anhängen.
Wenn Du die DAT-Datei mit einem Text-Editor öffnest, dann sieht sie gleich aus.
Hast Du Dir die Dat mal mit einem Hex-Editor angeschaut?
Z.B. mit HxD von
mael Link:
HxD - schneller Hexeditor, Disk-Editor und RAM-Editor [
http://www.delphi-forum.de/viewtopic.php?t=36173]
Beispielsweise die clock.avi aus dem Windows-Ordner:
Mit dem Windows-Ediotor geöffnet:
Quelltext
1:
| RIFFjB AVI LISTŒ hdrlavih8 @B ¼ 2 A A |
Mit HxD geöffnet:
Quelltext
1: 2: 3: 4: 5: 6: 7:
| Offset(o) 00 01 02 03 04 05 06 07 10 11 12 13 14 15 16 17
00000000 52 49 46 46 6A 42 01 00 41 56 49 20 4C 49 53 54 RIFFjB..AVI LIST 00000020 8C 05 00 00 68 64 72 6C 61 76 69 68 38 00 00 00 Œ...hdrlavih8... 00000040 40 42 0F 00 BC 1B 00 00 00 00 00 00 10 08 00 00 @B..¼........... 00000060 0C 00 00 00 00 00 00 00 02 00 00 00 00 32 00 00 .............2.. 00000100 41 01 00 00 41 A...A |
Du siehst das die Hex-Ansicht der Daten mehr Informationen bieten.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!