Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Indirekt: Strings vergleichen (inside more) (https://www.delphipraxis.net/8107-indirekt-strings-vergleichen-inside-more.html)

fkerber 28. Aug 2003 19:19


Indirekt: Strings vergleichen (inside more)
 
Hi!
Ich habe folgendes Problem: :(

Ich habe eine Datei mir 80.296 Zeilen :lol: In jeder Zeile steht ein Wort.
Diese Datei soll jetzt sozusagen als Wörterbuch dienen. Wenn man also die Rechtschreibprüfung anschmeißt soll jedes Wort mit dem Wörterbuch verglichen werden. Dabei hab ich 2 Probleme:

a) Bei manchen Wörter (nicht bei allen) siehts so aus
Wort\Steuerzeichen z.b.
Test\Q3454

b) ich kann wohl schlecht wort für Wort die Datei durchsuchen, das dauert ja Jahre :!:

Wer hat Lösungsvorschläge :?:

Danke schonmal!

Ciao fkerber

Minz 30. Aug 2003 17:46

Re: Indirekt: Strings vergleichen (inside more)
 
1. Die Wörter in eine Datenbank umschreiben.

oder

2. Die Datei in viele aufteilen, so dass in jeder Datei der erste oder die beiden ersten Buchstaben verschieden sind.

Ich würde aber 1. vorziehen :)

An der Datei hätte ich übrigens interesse :mrgreen:

fkerber 30. Aug 2003 19:08

Re: Indirekt: Strings vergleichen (inside more)
 
Hi!
Die Datei ist das Wörterbuch Deutsch von OpenOffice.

Man kann auf openoffice.org das pack runterladen, indem ein Haufen Sprachen enthalten sind!


Aber wie soll ich das in ne Datenbank bekommen?
Abtippen geht ja wohl nicht :(

Ciao fkerber

Hansa 30. Aug 2003 19:16

Re: Indirekt: Strings vergleichen (inside more)
 
80.000 Zeilen, was ist das denn ? Nichts :!: Ist das ganze überschaubar, dann packe es einfach in ein array. Eine verkettete Liste wäre aber schon besser.

fkerber 30. Aug 2003 19:29

Re: Indirekt: Strings vergleichen (inside more)
 
Zitat:

Zitat von Hansa
80.000 Zeilen, was ist das denn ? Nichts :!:

Das ist ja jetzt nicht grad aufbauend, danke!

Es ist eine Datei und in jeder Zeile steht ein Wort, das iss alles und das in ein array kann nich ganz hinhauen oder?

Ciao fkerber

Minz 30. Aug 2003 19:29

Re: Indirekt: Strings vergleichen (inside more)
 
Stimmt eigentlich! Das wäre dann die 3. und womöglich schnellste Lösung, wenn du das Array und drumherum gut organisierst. Wenn du natürlich nur einseitige Texte prüfen lassen willst, brauchst du dir darum wahrscheinlich keine Sorgen zu machen :mrgreen:

Was du auf jedenfall machen solltest, die Wörter von ihren anhängseln trennen.

1. Dateihandling: Delphi-Online-Hilfe: Stichwort: Assignfile, ReadLn

2. Stringverarbeitung ein Problem?

3. Dynamischer Array oder Datenbank ein problem?

Gruß Minz

Hansa 30. Aug 2003 19:40

Re: Indirekt: Strings vergleichen (inside more)
 
Zitat:

Zitat von fkerber
Das ist ja jetzt nicht grad aufbauend, danke!

Willst Du nur dumm fragen und eine fertige Lösung haben, oder ein Problem lösen ? Falls letzteres zutrifft, darfst Du auch ruhig "dumm" fragen. Warum probierst Du nicht einfach die Vorschläge aus und fragst notfalls nochmal nach ?

Minz 30. Aug 2003 19:45

Re: Indirekt: Strings vergleichen (inside more)
 
Hehe ruhig Blut :mrgreen: hier liegt glaub ich ein Missverständnis vor !

Hansa wollte blos sagen, dass 80.000 Zeilen für ein Array nicht zuviel sind.

Wenn das durchschnittliche Wort, sagen wir mal 10 Zeichen hat, und jedes Zeichen 1 Byte verbraucht, dann sind das grade mal 800.000 Byte, also noch nicht mal ein MB. Vom Tempo her sollte es auch reichen. Ansonsten hätte ich da noch eine Idee, um das ganze zu beschleunigen.

Allerdings könnte es sein, das der Ladevorgang in das Array etwas dauern könnte. Das wäre glaub ich der einzige Vorteil an der Datenbank.

MSCH 30. Aug 2003 19:50

Re: Indirekt: Strings vergleichen (inside more)
 
unabhägig davon, daseine DB wesentlich schneller ist, sofern man indizes hinzunimmt. Und das ganze in eine DB zu hauen, isst wirklich nun kein akt. IMHO kann jede DB sowas in eine Tabelle importieren. Habs grad mit MSSQL durch, dauert ca. 2 minuten und es waren mehr als 15.000 Wörter.
grez
msch

Hansa 30. Aug 2003 19:52

Re: Indirekt: Strings vergleichen (inside more)
 
Delphi-Quellcode:
var i : integer;
    st : string;
    datei : text;
    ArrayVar : Array [1..100000] of char [20];
begin
  AssignFile (datei 'Text.TXT');
  reset (datei)
  i := 0;
  while not EOF (datei) do begin
    i := i + 1;
    readln (datei,st);
    ArrayVar [i] := st;
  end;
end.
Das ist alles.

Minz 30. Aug 2003 19:57

Re: Indirekt: Strings vergleichen (inside more)
 
Rein Interessehalber:

ist es besser char[20] zu nehmen als String?

Ich hätte jetzt strings genommen!

Das ein String ein array of char ist, hab ich schon gehört,
aber hat das ganze jetzt auch eine praktische bedeutung? Oder ist es völlig egal ob ich char oder string nehme?


Achso und die Datenbank soll echt schneller sein als ein Array?
Ich dachte da Datenbank gleichbedeutend mit Festplattenzugriff ist, obwohl wenn die komplett gecached wird... :coder:

fkerber 30. Aug 2003 19:58

Re: Indirekt: Strings vergleichen (inside more)
 
Zitat:

Zitat von Minz
3. Dynamischer Array oder Datenbank ein problem?

Ein bisschen schon, hab mal grad Hansa's Code probiert, bekomme aber folgende Fehlermeldungen:

Zitat:

[Error] Unit1.pas(36): Incompatible types: 'procedure, untyped pointer or untyped parameter' and 'String'
[Error] Unit1.pas(37): Incompatible types: 'Char' and 'String'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'
Wie krieg ich das denn in ne Datenbank?

ciao und danke für eure hilfe

fkerber

fkerber 30. Aug 2003 20:04

Re: Indirekt: Strings vergleichen (inside more)
 
Hi!

Konnte Hansas Code doch zum laufen bringen. Danke dafür schonmal!
Und wie krieg ich jetzt raus, ob ein Wort in dem Array ist?

Ciao fkerber

Hansa 30. Aug 2003 20:06

Re: Indirekt: Strings vergleichen (inside more)
 
char (20) war ein Tipfehler, das sollte string [20] heißen. Und das Stück Code ist ein ganzen Programm und auch nur ein schnell getipptes Beispiel.

Minz 30. Aug 2003 20:07

Re: Indirekt: Strings vergleichen (inside more)
 
Code:
procedure FormingAltDic;
var altDic: textfile;
     s:string;
     woerter: array of string;
begin
  assignfile(altDic, 'de_DE.dic');
  reset(altDic);

  while not eof(altDic) do begin
     readln(altDic, s);
     SetLength(woerter, length(woerter)+1);
     woerter[high(woerter)]:=s;
  end;

  closefile(altDic);
end;

Im Array woerter sollten jetzt alle Zeilen verfügbar sein.
Habsch aber net getestet!

Hansa 30. Aug 2003 20:08

Re: Indirekt: Strings vergleichen (inside more)
 
die Wörter kriegst Du mit pos raus -> Lesen :!:

Minz 30. Aug 2003 20:10

Re: Indirekt: Strings vergleichen (inside more)
 
Ähm hast du die Wörter schon von ihren Anhängseln getrennt??

MSCH 30. Aug 2003 20:24

Re: Indirekt: Strings vergleichen (inside more)
 
Apropos, die Suche über das Array (ich würd das eher dynamisch machen)
wirst du wohl sequenziell machen dürfen, da hier jedweder Sortieralgo fehlt, und bei jedem Wort, ein Array[von 0 bis was_weis_ich_wie_weit] abzugrasen ist verry bad code:
Auch gehts noch einfacher mit einer StringList, die kann man sogar sortieren:
Delphi-Quellcode:
MyStringList:= TStringList.Create;
MyStringList.LoadFromFile('C:\irgentwas.txt');
grez
msch

Hansa 30. Aug 2003 20:27

Re: Indirekt: Strings vergleichen (inside more)
 
das dynamische war die verkettete Liste, aber ein Stringgrid wäre tatsächlich das einfachste.

fkerber 30. Aug 2003 20:32

Re: Indirekt: Strings vergleichen (inside more)
 
Hi!

Nein, hab sie noch nicht von den Anhängseln getrennt. Ne idee, wie ich das am einfachsten machen kann. Wenn ein Anhängsel da ist, wird es mit \ vom Wort getrennt.

Sollte ich es jetzt am besten mit array machen oder anders?

Zitat:

Zitat von Hansa
die Wörter kriegst Du mit pos raus -> Lesen

Kann jetzt damit grad nix anfangen, kannst du das etwas näher erläutern?

Ciao und danke schonmal

Hansa 30. Aug 2003 20:34

Re: Indirekt: Strings vergleichen (inside more)
 
das müßte jetzt wirklich völlig ausreichen. pos erkläre ich nicht auch noch.

fkerber 30. Aug 2003 20:44

Re: Indirekt: Strings vergleichen (inside more)
 
Hi!

ich hab das mit pos hingekriegt!

Danke für die größtenteils freundliche Hilfe!
Habe damit dann alles in den Griff gekriegt!


Danke! :)

Ciao fkerber

Minz 30. Aug 2003 22:13

Re: Indirekt: Strings vergleichen (inside more)
 
@MSCH

Das Array/die Liste ist bereits sortiert, da alphabetisch aus dem Wörterbuch übernommen :mrgreen:

@fkerber

Wie lange dauert denn das Einlesen der Datei in dein Array ungefähr?

Ob du ein Array nehmen sollst musst du selber entscheiden :mrgreen:
Die Geschwindigkeit beim Wörter im Array suchen, kannst du durch ein zweites Array erhöhen. In diesem zweiten Array speicherst du zu den Anfangsbuchstaben die Positionen im ersten Array, an denen die Wörter mit den jeweiligen Buchstaben beginnen und enden.

So brauchst du dann immer nur einen Bruchteil des Arrays durchsuchen!

Spart enorm Zeit wenn du statt 80.000 Wörtern nur noch 10.000 hast.

fkerber 30. Aug 2003 22:26

Re: Indirekt: Strings vergleichen (inside more)
 
Hi!

Das Einlesen dauert im Schnitt ca. 6 Sekunden (Rechner hat allerdings auch 2,4 GHz und 1024 mb Ram).

Mit dem 2. Array, das iss ne super idee!
Werd ich morgen mal probieren!

Ciao fkerber

Minz 31. Aug 2003 10:44

Re: Indirekt: Strings vergleichen (inside more)
 
Achso und in Richtung Optimierung wäre es gut, wenn du die Wörter tatsächlich von ihren Anhängseln trennst. Dann ersparst du dir beim durchsuchen die Pos-Function und kannst direkt vergleichen.

Code:
function getWord(s:string):string;
var i:byte;
     zeichen: string[1];
     wort: string;
begin
   for i:=0 to length(s)-1 do begin
      zeichen:=s[i];
      if zeichen<>'\' then wort:=wort+zeichen
      else result:=wort;
   end;
   result:=wort;
end;
Not tested!


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:03 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz