| Autor |
Beitrag |
basner
      
Beiträge: 39
|
Verfasst: Fr 29.05.09 11:01
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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Gausi
      
Beiträge: 8554
Erhaltene Danke: 480
Windows 7, Windows 10
D7 PE, Delphi XE3 Prof, Delphi 10.3 CE
|
Verfasst: Fr 29.05.09 11:08
Ich werfe einfach mal Pos und PosEx in den Raum. 
_________________ We are, we were and will not be.
|
|
basner 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: Fr 29.05.09 11:10
Also du willst finden, welche Wörter es im Text gibt?
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
Krischa
      
Beiträge: 118
Windows 7 64 Bit
Delphi 2007
|
Verfasst: 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
Zuletzt bearbeitet von Krischa am Fr 29.05.09 11:16, insgesamt 2-mal bearbeitet
|
|
basner 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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 ...
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|
basner 
      
Beiträge: 39
|
Verfasst: 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 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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...
Zuletzt bearbeitet von ffgorcky am Sa 30.05.09 13:52, insgesamt 1-mal bearbeitet
|
|
Marc.
      
Beiträge: 1876
Erhaltene Danke: 129
Win 8.1, Xubuntu 15.10
|
Verfasst: 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 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 573
WIN XP/2000 & 7Prof (Familie:Win95,Win98)
|
Verfasst: 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 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
basner 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 2352
Erhaltene Danke: 4
Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
|
Verfasst: 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.
_________________ MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
|
|
basner 
      
Beiträge: 39
|
Verfasst: 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
      
Beiträge: 8721
Erhaltene Danke: 191
Win95, Win98SE, Win2K, WinXP
D1S, D3S, D4S, D5E, D6E, D7E, D9PE, D10E, D12P, DXEP, L0.9\FPC2.0
|
Verfasst: 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.
_________________ Anyone who is capable of being elected president should on no account be allowed to do the job.
Ich code EdgeMonkey - In dubio pro Setting.
|
|