Autor Beitrag
Die Brotmafia
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win XP Suse Linux 9.3
Delphi 7 Enterprise, Delphi 2005
BeitragVerfasst: Mi 05.03.08 20:37 
Ich würde gerne in Delphi eine Liste von Wörtern welche zum Teil keinen Sinn ergeben (aaa, aab, aabd) mit einer Wortliste abgleichen. Die Liste der sinnlosen Wörter besteht aus > 50000 Wörtern weshalb es keinen Sinn macht das ganze "durchzuschauen" und die sinnvollen Wörter rauszuschreiben. Deshalb will ich die ganzen Wörter mit einer Wortliste welche die meistbenutzten deutschen Wörter enthält "abgleichen" und automatisch in eine Datei / Memo schreiben lassen bei welchen der Wörter eine Übereinstimmung vorhanden ist.

Ich bin bisher soweit das mein Konzept folgendermaßen aussieht:

Ich nehme 2 Variablen, jeweils Strings. Die eine Variable sei "Wort1", die andere Variable "Wort2". Für Wort 1 füge ich das erste der Wörter (aaaa) ein. Für Wort 2 das erste Wort der Wortliste (Aal). Dann sage ich "wenn Wort1 = Wort2" soll er es in ein Memo schreiben. Wenn Wort1 ungleich Wort2 (wie isn der Befehl für ungleich in Delphi?) soll er für Wort 2 das nächste Wort der Wortliste verwenden bis er alle durch hat. Hat er alle Wörter der Wortliste durch setzt er für Wort 1 das nächste Wort ein (aaab) und verfährt gleich.

Das ist nur das theoretische. Das Problem: Ich will, dass die groß und kleinschreibung dabei keine Rolle spielt. In der Wortliste werden manche Sachen wie z.B. "Bücher" groß geschrieben, hätte gerne das diese klein geschrieben werden.

Danke!
nagel
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 708

Win7, Ubuntu 10.10

BeitragVerfasst: Mi 05.03.08 21:02 
Auf Ungleich testest du mit <>.

Mit AnsiLowerCase konvertierst du einen String in Kleinbuchstaben.
dummzeuch
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 593
Erhaltene Danke: 5


Delphi 5 ent, Delphi 6 bis Delphi XE8 pro
BeitragVerfasst: Mi 05.03.08 22:12 
user profile iconnagel hat folgendes geschrieben:
Auf Ungleich testest du mit <>.

Mit AnsiLowerCase konvertierst du einen String in Kleinbuchstaben.


Oder mit NOT AnsiSameText beides auf einmal.

Wenn man mehrfach vergleicht, kann es sich aber lohnen, die Umwandlung nur einmal durzufuehren.

twm
Lannes
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2352
Erhaltene Danke: 4

Win XP, 95, 3.11, IE6
D3 Prof, D4 Standard, D2005 PE, TurboDelphi, Lazarus, D2010
BeitragVerfasst: Mi 05.03.08 23:28 
Hallo,

kannst Dich auch mal mit TStrings.IndexOf beschäftigen, IndexOf berücksichtigt Groß-/Kleinschreibung nicht.

z.B.:
ausblenden Delphi-Quelltext
1:
2:
if MyStringList.IndexOf('irgendwas') = -1 then
  //nicht in Liste

_________________
MfG Lannes
(Nichts ist nicht Nichts) and ('' <> nil ) and (Pointer('') = nil ) and (@('') <> nil )
JoelH
ontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic starofftopic star
Beiträge: 806
Erhaltene Danke: 17

Win10
Delphi Alexandria 11.2 Patch 1
BeitragVerfasst: Do 06.03.08 10:26 
ich würde auch Stringlisten verwenden, wie es Lannes vorgeschlagen hat. Die haben zudem nämlich auch noch den Vorteil, dass sie sich via loadfromfile direkt mit einer Datei füllen lassen. Und mit IndexOf nimmt dir Delphi auch sehr viel Arbeit ab.

_________________
mfg. Joel
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 3661
Erhaltene Danke: 604

Win 8.1, Win 10 x64
Pascal: Lazarus Snapshot, Delphi 7,2007; PHP, JS: WebStorm
BeitragVerfasst: Do 06.03.08 16:17 
Du wirst ein Geschwindigkeitsproblem kriegen, wenn du nicht nach dem Prinzip einer Skiplist o.ä. arbeitest:
  • Wortliste sortieren
  • Da in die Liste springen wo Buchstabe 1 zum ersten mal ist
  • Weiterspringen bis zum 2. Buchstaben
  • Weiterspringen bis zum 3. Buchstaben usw

Und entsprechend abbrechen wenn ein Buchstabe nicht gefunden werden kann.
Ok, ist eigentlich eine ganz normale Baumsuche, aber immerhin kannst du mit der Methode darauf verzichten, einen Baum zu bauen, sondern kannst direkt auf der Liste arbeiten.


Da ich aber weiß, was du erreichen willst, ist es einfacher, die zu einem Wort führende(n) Zahlenfolge(n) zu ermitteln, und darüber zu suchen. Geht schneller ;)

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
Die Brotmafia Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 110

Win XP Suse Linux 9.3
Delphi 7 Enterprise, Delphi 2005
BeitragVerfasst: Do 06.03.08 17:12 
Also leute, ich bin jetzt soweit mit dem Listen abgleichen:

ausblenden volle Höhe Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
// Unwichtiges rausgekürzt

// Hier kann man das Memo1 in eine datei abspeichern, ist das richtig so?
procedure TForm1.Button2Click(Sender: TObject);
begin
 SaveDialog1.Execute;
 Memo1.Lines.SaveToFile(SaveDialog1.FileName);
end;

// Hier kann man die Wortliste welche ich verwenden will in Memo2 reinladen
procedure TForm1.Button3Click(Sender: TObject);
begin
 OpenDialog1.Execute;
 Memo2.Lines.LoadFromFile(OpenDialog1.FileName);
end;

// Hier wird beides verglichen, was ich nicht sonderlich gut mache
procedure TForm1.Button4Click(Sender: TObject);
var Quatsch, Wortliste: string;
    a,b : integer;
begin
b:=-1;
repeat
 Application.ProcessMessages;
 a:=-1;
 b:=b+1;
 Quatsch:=AnsiLowerCase(Memo1.Lines[b]);
 ProgressBar1.Position:=b;
 Label6.Caption:=Quatsch;
  repeat
  Application.ProcessMessages;
   a:=a+1;
   Wortliste:=AnsiLowerCase(Memo2.Lines[a]);
    if (Quatsch=Wortliste) and (Quatsch<>'') then begin
     Memo3.Lines.Add(Quatsch);
    end
    else
  until
   a>10000;
  until
  b>50000;
end;

end.


So, das Vergleichen sieht natürlich katastrophal aus wie ihr schon bemerkt habt. Habe einfach irgendwelche Großen Zahlen genommen anstatt soviele wie eben Zeilen im Memo vorhanden sind. Wie kann ich herausfinden wie viele Zeilen sich in einem Memo befinden? Ich habe gesucht aber ich finde den Befehl nicht. Er müsste ja theoretisch nur so oft wiederholen, wie sich Wörter im Memo befinden allerdings finde ich keinen Befehl um heraus zu finden wie viele Zeilen ein Memo hat, muss ich da selbst noch eine Funktion schreiben welche jede Zeile im Memo durchgeht bis sie irgendwann mal auf einen leeren Text stößt? Danke!

Moderiert von user profile iconjasocul: Code- durch Delphi-Tags ersetzt
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 06.03.08 17:17 
Man hätte aber darauf kommen könnnen:
ausblenden Delphi-Quelltext
1:
memo.lines.count;