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 user profile iconNarses: 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 user profile iconNarses: 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 //diesen Befehl kannst Du ja mit meinem Vorschlag von Gestern zusammen nutzen!
     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 //diesen Befehl kannst Du ja mit meinem Vorschlag von Gestern zusammen nutzen!
    begin
    //hier erst mal wieder sagen, dass noch nichts doppeltes gefunden wurde (ist ja ein neuer Wert!):
    doppeltesGefunden:=false;
    // Löschen, wenn die gewünschte Mindestlänge nicht erreicht wurde: 
    if Length(OutputMemo.Lines[i])<gewuenschteMindestlaenge then
       DelLine(OutputMemo,i)
    else //also wenn die aktuelle Zeile lang genug ist:
       // Gucken, ob es diesen Wert schon gab - wenn ja, dann den gerade bei der Suche gefundenen löschen:
       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 user profile iconNarses: Beiträge zusammengefasst---

Ok hier ist die Datei gezipt. Ich bin für jede Idee dankbar


Lannes - Mo 01.06.09 11:09

Hallo,

:?

user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
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:
user profile iconBenBE hat folgendes geschrieben Zum zitierten Posting springen:
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 user profile iconmael 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.