Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Wörterbuch Datei (https://www.delphipraxis.net/142209-woerterbuch-datei.html)

Delphi-Narr 23. Okt 2009 20:06


Wörterbuch Datei
 
Hi, ich wusste nicht genau, wohin mit diesem Beitrag...

Also ich habe mit Delphi 5 einen Vokabektrainer programmiert. Beim Start greift dieser auf eine Datei zu, in der die abzufragenden Vokabeln gespeichert sind.
Gespeichert wird folgendermaßen:

DeutschEnglischDeutsch.txt:



Deutsch1
Englisch1
Deutsch2
Englisch2
usw.

Jetzt meine Frage:
Weiß jemand, wo man eine solche Datei herunterladen kann? Kann von mir aus auch so sein:

Deutsch1#Englisch1

Deutsch1/Englisch1 etc.

Hauptsache nicht

Deutsch1::Englisch1Deutsch2::Englisch2

So eine hab ich gefunden, aber die auseinander zu nehmen ist ein bisschen zu aufwendig...

Liebe Grüße!

himitsu 23. Okt 2009 20:08

Re: Wörterbuch Datei
 
für
Delphi-Quellcode:
Deutsch1=Englisch1
Deutsch2=Englisch2 
...
kann man ganz einfach eine TStringList nehmen
.Name und .Value

auch für diese
Delphi-Quellcode:
Deutsch1
Englisch1
Deutsch2
Englisch2
ist diese zu gebrauchen
gerade Indize = Deutsch
ungerade Indize (deutscher Index + 1) = Englisch

Meflin 23. Okt 2009 20:15

Re: Wörterbuch Datei
 
Zitat:

Zitat von Delphi-Narr
Deutsch1::Englisch1Deutsch2::Englisch2

So eine hab ich gefunden, aber die auseinander zu nehmen ist ein bisschen zu aufwendig...

Guck dir die mal in nem HexEditor oder so an. Da MUSS ja irgendein Trennzeichen dazwischen sein. Wenn du das ermittelt hast, lässt sich das ganze ja recht einfach in dein bevorzugtes Format umwandeln ;)

Delphi-Narr 24. Okt 2009 09:44

Re: Wörterbuch Datei
 
@himitsu: Die benutze ich schon. Der Benutzer kann auch eine eigene Datei erstellen usw. Nur habe ich keine Lust die Dateien alle selber zu machen. Prinzipiell klappt das ja.

Ich guck mal mit dem Hex nach...

Tryer 24. Okt 2009 10:14

Re: Wörterbuch Datei
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  i: Integer;
begin
  Caption :='';
  for i := 1 to Pred(Length(Edit1.Text)) do
    if (Edit1.Text[i] > 'Z') and (Edit1.Text[i+1] < 'a') then
      Caption := IntToStr(i+1);
end;
Falls da kein Trennzeichen zwischen steht:
Großbuchstabe folgt direkt auf einen Kleinbuchstaben -> hier fängt neuer Begriff an (unwahrscheinlich weil unsauber, aber nicht ausgeschlossen). Oder stehen da wirklich Zahlen mit in der Datei? Schwierig zu beurteilen ohne einen Ausschnitt der echten Datei zu sehen.

himitsu 24. Okt 2009 10:18

Re: Wörterbuch Datei
 
Vermutlich hatte er die Datei nur mit'm Notepad geöffnet und in der Datei sind nur Linux-Umbrüche (#10) drin, welcher der Notepad (und auch andere "Editoren") nicht versteht.

Medium 24. Okt 2009 10:55

Re: Wörterbuch Datei
 
Ausserdem soll es wohl im Eingangsposting "herunterladen" und nicht "laden" heissen. Einfach mal nicht bedeutungsverändernd abkürzen erspart Missverständnisse wie im drauf folgenden von Himi.

Delphi-Narr 25. Okt 2009 16:07

Re: Wörterbuch Datei
 
Nee, Notepad geht, hatte noch einen anderen Editor benutzt

Hab jetzt also Deutsch::Englisch

Jetzt möchte ich mir ein Programm machen, dass diese Datei einmal komplett umschreibt.


Delphi-Quellcode:
var
i:integer;//Zählt die Zeilen
i2:integer;//Zählt in den Zeilen von Zeichen zu Zeichen
SL:TStringlist;

begin
     SL := TStringList.Create;
         Try
      Try
        SL.LoadFromFile('C:\Users\Alt.txt');//Datei wird in die Liste geladen
        For i := 1 to SL.Count-1 do //Solange, bis das Ende der Liste erreicht ist
            begin
                 for i2:=1 to {Länge der aktuellen Zeile i} do
                    begin
                         if {Das i2-te Zeichen aus der aktuellen Zeile}=(':') then
                         begin
                              {Ersetze das Leerzeichen davor, das aktuelle Zeichen, das Zeichen danach
                              (auch ':') und das Leerzeichen danach durch einen Zeilenumbruch
                               Aus
                               Hallo :: Hello
                               soll werden
                               Hallo
                               hello}
                         end;
         gewisse ends und finallys...

        SL.SaveToFile('C:\Users\Neu.txt');

end;

DeddyH 25. Okt 2009 16:14

Re: Wörterbuch Datei
 
Da wäre StringReplace eine einfache Option.
Delphi-Quellcode:
var
  SL:TStringlist;
begin
  if FileExists('C:\Users\Alt.txt') then
    begin
      SL := TStringList.Create;
      try
        SL.LoadFromFile('C:\Users\Alt.txt');//Datei wird in die Liste geladen
        SL.Text := StringReplace(SL.Text,' :: ',sLineBreak,[rfReplaceAll]);
        SL.SaveToFile('C:\Users\Neu.txt');
      finally
        SL.Free;
      end;
    end;
end;

himitsu 25. Okt 2009 16:16

Re: Wörterbuch Datei
 
Soviele Kommentare sind nicht grad übersichlich und verbessern die Lesbarkeit des Codes nicht wirklich


Delphi-Quellcode:
for i2:=1 to {Länge der aktuellen Zeile i} do
  begin
    if {Das i2-te Zeichen aus der aktuellen Zeile}=(':') then
Kennst du schon Delphi-Referenz durchsuchenPos?


Und warum läßt du diese Datei nicht einfach so, wie sie ist?
Macht sich Einfacher, wenn du sie z.B. irgendwann mal durch 'ne neuere Version ersetzt.
Delphi-Quellcode:
SL := TStringList.Create;
SL.LoadFromFile('C:\Users\Alt.txt');
SL.Text := StringReplace(SL.Text, ' :: ', '=', [rfReplaceAll]);
So und hast du alles ganz praktisch in der Stringliste
und kannst via SL.Name[i] (deutsch) und SL.Value[i] (englisch) drauf zugreifen.

Delphi-Narr 25. Okt 2009 16:20

Re: Wörterbuch Datei
 
Sieht gut aus, nur kennt mein Delphi sLineBreak nicht, muss ich da was bei uses hinzufügen?

@himitsu:

Ich hab das Programm zum Anfragen ja fertig, muss also nur noch die entsprechende Datei laden. Außerdem ist das für selbsterstellte Dateien einfacher, da diese ' :: ' schon nervig sind, wenn du die immer schreiben musst.

DeddyH 25. Okt 2009 16:22

Re: Wörterbuch Datei
 
Dann definier Dir die Konstante einfach.
Delphi-Quellcode:
const sLineBreak = #13#10;

Delphi-Narr 25. Okt 2009 16:26

Re: Wörterbuch Datei
 
Ah, mir fehlten die Werte für den Umbruch... Danke.
Weißt du, wie lange das bei ca. 750000 Zeilen dauern wird? Die .txt ist 7.5 MB groß.

DeddyH 25. Okt 2009 16:28

Re: Wörterbuch Datei
 
In Sekunden kann ich Dir das nicht sagen, das hängt ja wohl auch von der Rechnerkonfiguration ab, aber ich kann mir vorstellen, dass das schon einige Zeit braucht.

Delphi-Narr 25. Okt 2009 16:29

Re: Wörterbuch Datei
 
Da bin ich ja mal gespannt... Ich leg mal die Stoppuhr daneben :)

Danke!

Delphi-Narr 25. Okt 2009 17:35

Re: Wörterbuch Datei
 
Das läuft jetzt schon seit einer Stunde...
Im Taskmanager steht Keine Rückmeldung
Liegt das daran, dass sich das Prog in einer elend langen Prozedur befindet und während einer Aufgabe keine Rückmeldung gibt? CPU ist die ganze Zeit bei 100%...

DeddyH 25. Okt 2009 17:49

Re: Wörterbuch Datei
 
Eine Stunde erscheint mir auch bei 7,5 MB etwas viel. Vielleicht solltest Du mal je Schritt eine Meldung ausgeben lassen, damit Du siehst, was da so lange dauert.

Delphi-Narr 25. Okt 2009 17:56

Re: Wörterbuch Datei
 
Ich hatte überlegt, einen Balken zu benutzen. Also am ehesten eine ProgressBar, aber der führt diesen Befehl doch direkt aus, oder:

Delphi-Quellcode:
try
        SL.LoadFromFile(vOrt);//Datei wird in die Liste geladen
        SL.Text := StringReplace(SL.Text,' :: ',sLineBreak,[rfReplaceAll]);
        SL.SaveToFile(vZiel);
finally
Das ist ja keine Schleife...
Kann man das auch als for-Schleife machen und immer noch den StepBy vom Ladebalken um einen erhöhen?

DeddyH 25. Okt 2009 17:58

Re: Wörterbuch Datei
 
Dazu müsstest Du Dir Dein eigenes StringReplace schreiben.

Delphi-Narr 25. Okt 2009 17:59

Re: Wörterbuch Datei
 
Also man kann nicht für SL.text Sl[i] einsetzen, sodass sich das nur auf die eine Zeile bezieht?

Meflin 25. Okt 2009 18:02

Re: Wörterbuch Datei
 
Zitat:

Zitat von Delphi-Narr
Also man kann nicht für SL.text Sl[i] einsetzen, sodass sich das nur auf die eine Zeile bezieht?

Klar kannst du eine StringList auch zeilenweise durchgehen...

Delphi-Narr 25. Okt 2009 18:07

Re: Wörterbuch Datei
 
Delphi-Quellcode:
 var
  SL:TStringlist;
  i:integer;
begin
  if FileExists(vOrt) then
    begin
      SL := TStringList.Create;
      {ProgressBar1.Step:=SL.Count-1;}
      try
        SL.LoadFromFile(vOrt);//Datei wird in die Liste geladen
        for i:=1 to SL.Count-1 do
        begin
        SL[i] := StringReplace(SL.Text,' :: ',sLineBreak,[rfReplaceAll]);
        Progressbar1.StepBy(1);
        end;
        SL.SaveToFile(vZiel);
      finally
        SL.Free;
      end;
    end;
end;
So? Wenn ich das so mache (Steps der ProgressBar sind auf 100) Passiert nichts. Ich lad mal eine andere Datei da rein, die nur einen Ausschnitt davon enthält


Edit:

Aus:

[wir/sie/Sie] passten :: [we/they/you] were suitable
[wir/sie/Sie] rieben :: [we/they/you] rubbed
[wir/sie/Sie] sangen :: [we/they/you] sang
[wir/sie/Sie] saßen :: [we/they/you] sat
[wir/sie/Sie] schrieben :: [we/they/you] wrote
[wir/sie/Sie] schwammen :: [we/they/you] swam
[wir/sie/Sie] schwitzen :: [we/they/you] are transpiring [perspiring, sweating]
[wir/sie/Sie] sind / waren gewesen :: [we/they/you] have / had been
[wir/sie/Sie] sind :: [we/they/you] are
[wir/sie/Sie] sind Bankrott erklärt worden :: [we/they/you] have been adjudged bankrupt
[wir/sie/Sie] sind Bankrott erklärt worden :: [we/they/you] have been declared bankrupt
[wir/sie/Sie] sind berechtigt zu :: [we/they/you] shall be entitled to




Wird (Die ersten 79 Zeilen:)

[wir/sie/Sie] passten :: [we/they/you] were suitable
[wir/sie/Sie] passten
[we/they/you] were suitable
[wir/sie/Sie] rieben
[we/they/you] rubbed
[wir/sie/Sie] sangen
[we/they/you] sang
[wir/sie/Sie] saßen
[we/they/you] sat
[wir/sie/Sie] schrieben
[we/they/you] wrote
[wir/sie/Sie] schwammen
[we/they/you] swam
[wir/sie/Sie] schwitzen
[we/they/you] are transpiring [perspiring, sweating]
[wir/sie/Sie] sind / waren gewesen
[we/they/you] have / had been
[wir/sie/Sie] sind
[we/they/you] are
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been adjudged bankrupt
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been declared bankrupt
[wir/sie/Sie] sind berechtigt zu
[we/they/you] shall be entitled to

[wir/sie/Sie] passten
[we/they/you] were suitable
[wir/sie/Sie] passten
[we/they/you] were suitable
[wir/sie/Sie] rieben
[we/they/you] rubbed
[wir/sie/Sie] sangen
[we/they/you] sang
[wir/sie/Sie] saßen
[we/they/you] sat
[wir/sie/Sie] schrieben
[we/they/you] wrote
[wir/sie/Sie] schwammen
[we/they/you] swam
[wir/sie/Sie] schwitzen
[we/they/you] are transpiring [perspiring, sweating]
[wir/sie/Sie] sind / waren gewesen
[we/they/you] have / had been
[wir/sie/Sie] sind
[we/they/you] are
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been adjudged bankrupt
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been declared bankrupt
[wir/sie/Sie] sind berechtigt zu
[we/they/you] shall be entitled to

[wir/sie/Sie] sangen
[we/they/you] sang
[wir/sie/Sie] saßen
[we/they/you] sat
[wir/sie/Sie] schrieben
[we/they/you] wrote
[wir/sie/Sie] schwammen
[we/they/you] swam
[wir/sie/Sie] schwitzen
[we/they/you] are transpiring [perspiring, sweating]
[wir/sie/Sie] sind / waren gewesen
[we/they/you] have / had been
[wir/sie/Sie] sind
[we/they/you] are
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been adjudged bankrupt
[wir/sie/Sie] sind Bankrott erklärt worden
[we/they/you] have been declared bankrupt
[wir/sie/Sie] sind berechtigt zu
[we/they/you] shall be entitled to

[wir/sie/Sie] passten
[we/they/you] were suitable
[wir/sie/Sie] passten
[we/they/you] were suitable
[wir/sie/Sie] rieben


Die ganze Datei hat ca. 50000 Zeilen, in 5-10 Sekunden erstellt... Die sollte aber eigentlich nur 24 haben.

DeddyH 25. Okt 2009 18:11

Re: Wörterbuch Datei
 
Zitat:

Delphi-Quellcode:
SL[i] := StringReplace(SL.Text,' :: ',sLineBreak,[rfReplaceAll]);

:shock: Schau mal, was Du hier machst.

Delphi-Narr 25. Okt 2009 18:14

Re: Wörterbuch Datei
 
Oh, da muss ich wohl das zweite .Text auch noch ersetzen...

DeddyH 25. Okt 2009 18:16

Re: Wörterbuch Datei
 
Das macht auf jeden Fall Sinn, sonst wird die Datei "etwas" größer :lol:

Delphi-Narr 25. Okt 2009 18:17

Re: Wörterbuch Datei
 
Jo, und am Anfang muss ich i=0 setzen.
Jetzt sollte es klappen, ich guck mal was jetzt mit der großen Datei passiert


Edit:

So ich würd mal sagen, dein erster Code hatte auch irgendeinen Fehler...
5 Sekunden und das Teil war durch... 1,5 Mio Zeilen^^

DeddyH 25. Okt 2009 18:24

Re: Wörterbuch Datei
 
An einen Fehler glaub ich nicht, aber bei so großen Datenmengen ist StringReplace wohl nicht das Wahre. Stimmt Deine Datei denn jetzt auch?

Delphi-Narr 25. Okt 2009 18:27

Re: Wörterbuch Datei
 
Ja, ist korrekt.

Wenn ich jetzt noch ein Wörterbuch machen will, also mit Suche, wie mach ich das?

Ich Hab ein Editfeld und OnChange soll nach der ersten Zeile gesucht werden, die diese Zeichenfolge enthält.
Also wenn man Autob, so soll dann direkt auch Autobus gefunden werden... Das ist mit IndexOf ja nicht möglich...


Es wär auch ganz schön, wenn man Links und rechts jeweils eine Listbox hat, die die passenden Ergebnisse anzeigt (links) und
auf gleicher Höhe/gleiche Zeile die jeweilige Übersetzung (rechts).
Oben jeweils ein Suchfenster, welches in den Deutschen bzw. Englischen Einträgen sucht. Also für Deutsch die ungraden Zeilen und für Englisch die graden...

DeddyH 25. Okt 2009 18:30

Re: Wörterbuch Datei
 
Geh doch einfach in einer Schleife durch und schau, ob die aktuelle Zeile mit der gesuchten Zeichenfolge beginnt. Viel anders macht IndexOf das auch nicht, außer dass die komplette Zeichenfolge verglichen wird.

Delphi-Narr 25. Okt 2009 18:35

Re: Wörterbuch Datei
 
Hab oben noch eine Änderung gemacht...

Aber wenn man jetzt nach walk sucht, findet er nichts, weil die Zeile mit (to) beginnt...

DeddyH 25. Okt 2009 18:38

Re: Wörterbuch Datei
 
Dann musst Du eben nachschauen, ob der gesuchte String enthalten ist. Sei doch mal etwas kreativ.

Delphi-Narr 25. Okt 2009 19:18

Re: Wörterbuch Datei
 
Delphi-Quellcode:
var
i:integer;
SL:TStringlist   ;
Position:integer;
begin
     ListeD.Clear;
     ListeE.Clear;
     Sl:=TStringlist.Create;
     SL.LoadFromFile('C:\Users\Neu.txt');
     for i:=0 to SL.Count-1 do
         begin
              if Odd(i)=False then begin
              Position:=Pos(SucheD.text,SL[i]);
              if Position<>0 then begin
                 ListeD.Items.Add(SL[i]);
                 ListeE.Items.Add(SL[i+1]);
              end;
              end;
         end;      
end;
Klappt bisher ganz gut - dauert nur ewig lange... Kann ich den Suchvorgang im Hintergrund laufen lassen, sodass man etwas neues eingeben kann, während gesucht wird? Oder den Suchvorgang beschleunigen?
Und dann noch eine Sache: Wenn man im linken Feld scrollt, soll im rechten ebenfalls gescrollt werden, damit man nicht in der Zeile verrutscht. ->erledigt

olee 25. Okt 2009 19:37

Re: Wörterbuch Datei
 
Also erstmal solltest du bitte mal an deiner Code-formatierung arbeiten :roll:

Und um deine Frage zu beantworten kuck mal das an: Application.ProcessMessages

Der Code unten enthält diese Anwendung.

WICHTIG: Es ist nicht ratsam, diese Anweisung nach jedem Schleifendurchlauf aufzurufen, da sonst deine Suchfunktion bestimmt mal 10fach so lange dauert,
da ProcessMessages je nach Situation einiges an Zeit verbrät.

Deswegen ist die Bedingung (i mod 1000) = 0 drin, die dafür sorgt, das ProcessMessages nur alle 1000 Durchläufe aufgerufen wird ... das sollte mehr als genug sein.

Delphi-Quellcode:
var
  i       : integer;
  SL      : TStringlist;
  Position : integer;
begin
  ListeD.Clear;
  ListeE.Clear;
  Sl:=TStringlist.Create;
  SL.LoadFromFile('C:\Users\Lennart\Desktop\Vokabeltrainer Sonja\Datafiles\cfmdoffsfm-80141116124-9u69a\Neu.txt');
  for i := 0 to SL.Count-1 do
  begin
    if Odd(i) = False then
    begin
      Position:=Pos(SucheD.text,SL[i]);
      if Position<>0 then
      begin
        ListeD.Items.Add(SL[i]);
        ListeE.Items.Add(SL[i+1]);
      end;
    end;
    If (i mod 1000) = 0 then Application.ProcessMessages;
  end;      
end;
MFG

himitsu 25. Okt 2009 20:41

Re: Wörterbuch Datei
 
Was sind ListeD und ListeE eigentlich?

Womöglich sollte man da man über BeginUpdate/EndUpdate nachdenken.

olee 25. Okt 2009 20:50

Re: Wörterbuch Datei
 
Ich denke das sind die Listbox-Felder für die Ergebnisse.

MFG

Delphi-Narr 25. Okt 2009 20:52

Re: Wörterbuch Datei
 
Die Listen sind Listboxes, ListeD ist die, wo die Deutschen Wörter drinstehen und die andere die mit den Englischen

Also ich möchte, dass OnChange gesucht wird, also beim verändern die aktuelle Suche beendet wird und dafür die neue gestartet wird - mit einem Buchstaben mehr.

Also:

H ->Suche wird gestartet
Dann WÄHREND der Suche noch das a
Suche nach H wird abgebrochen und mit Ha neu gestartet usw. Selbst wenn ich ProcessMessages alle 2 mal durchlaufe, klappt das nicht...

Kann man die Prozeduren nicht irgendwie parallel laufen lassen, sodass ich was eingeben kann (und nicht 5 Sekunden warten muss, bis sich was tut) und der gleichzeitig sucht?

himitsu 25. Okt 2009 22:29

Re: Wörterbuch Datei
 
Das Application.ProcessMessages mach ich nie von einer Anzahl mit unbestimmter Zeiabhängig.
Dafür merke ich mir die Startzeit (GetTickCount) und führe dann alle x Millisekunden (100 bis 200) dieses aus.
Dort kann man dann auch mitbekommen, ob sich die Startbedingung geändert hat und beginnt die Suche von Neuem.

Abgesehn davon würde ich diese Liste noch parallel mit einer Index-Hashliste versehn oder, da man hier schön Alphabetisch sortieren kann, alles auf meherere Sublisten verteilen, so daß ich nicht immer alles durchsuchen muß.

olee 26. Okt 2009 12:44

Re: Wörterbuch Datei
 
Du solltest das dann so machen, dass in der Suchschleife das zu suchende wort sich in jedem durchlauf aus dem editfeld geholt wird.

Außerdem sollte nicht nachdem man einen weiteren Buchstaben ins Feld eingibt, sofort die ganze Suche neu gestartet werden, sondern eben
a) Die momentan laufende angepasse (siehe oben)
b) Die bisher gefundenen Einträge gefiltert werden (wenn der neu eingegebene Buchstabe bisherige Ergebnisse ausschließt)

Das solltest du mit ein wenig Nachdenken lösen können

MFG

Delphi-Narr 26. Okt 2009 13:23

Re: Wörterbuch Datei
 
Das mit den bisherigen Ergebnissen filtern hatte ich auch schon überlegt, aber der braucht ja 20 Sekunden, bis er die Suche nach 'H' abgeschlossen hat.
Wenn ich nach 5 Sekunden 'a' drücke, dann sind die Suchergebnisse der letzten 15 Sekunden nicht dabei und der durchsucht nur die bisherigen Funde... Mit dem alphabetisch sortieren guck ich mir mal an...

Wäre es eventuell sinnvoll, die Liste am Anfang einmal zu laden, sodass nicht bei jeder Veränderung eine Liste mir 28000000 Zeichen und 1,5 Mio Zeilen laden muss?!

himitsu 26. Okt 2009 13:46

Re: Wörterbuch Datei
 
Zitat:

Zitat von Delphi-Narr
aber der braucht ja 20 Sekunden,

hast du den Tipp auf Delphi-Referenz durchsuchenBeginUpdate/Delphi-Referenz durchsuchenEndUpdate beachtet?


Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 Uhr.
Seite 1 von 2  1 2      

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