![]() |
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! |
Re: Wörterbuch Datei
für
Delphi-Quellcode:
kann man ganz einfach eine TStringList nehmen
Deutsch1=Englisch1
Deutsch2=Englisch2 ... .Name und .Value auch für diese
Delphi-Quellcode:
ist diese zu gebrauchen
Deutsch1
Englisch1 Deutsch2 Englisch2 gerade Indize = Deutsch ungerade Indize (deutscher Index + 1) = Englisch |
Re: Wörterbuch Datei
Zitat:
|
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... |
Re: Wörterbuch Datei
Delphi-Quellcode:
Falls da kein Trennzeichen zwischen steht:
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; 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. |
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.
|
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.
|
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; |
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; |
Re: Wörterbuch Datei
Soviele Kommentare sind nicht grad übersichlich und verbessern die Lesbarkeit des Codes nicht wirklich
Delphi-Quellcode:
Kennst du schon
for i2:=1 to {Länge der aktuellen Zeile i} do
begin if {Das i2-te Zeichen aus der aktuellen Zeile}=(':') then ![]() 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:
So und hast du alles ganz praktisch in der Stringliste
SL := TStringList.Create;
SL.LoadFromFile('C:\Users\Alt.txt'); SL.Text := StringReplace(SL.Text, ' :: ', '=', [rfReplaceAll]); und kannst via SL.Name[i] (deutsch) und SL.Value[i] (englisch) drauf zugreifen. |
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. |
Re: Wörterbuch Datei
Dann definier Dir die Konstante einfach.
Delphi-Quellcode:
const sLineBreak = #13#10;
|
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ß. |
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.
|
Re: Wörterbuch Datei
Da bin ich ja mal gespannt... Ich leg mal die Stoppuhr daneben :)
Danke! |
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%... |
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.
|
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:
Das ist ja keine Schleife...
try
SL.LoadFromFile(vOrt);//Datei wird in die Liste geladen SL.Text := StringReplace(SL.Text,' :: ',sLineBreak,[rfReplaceAll]); SL.SaveToFile(vZiel); finally Kann man das auch als for-Schleife machen und immer noch den StepBy vom Ladebalken um einen erhöhen? |
Re: Wörterbuch Datei
Dazu müsstest Du Dir Dein eigenes StringReplace schreiben.
|
Re: Wörterbuch Datei
Also man kann nicht für SL.text Sl[i] einsetzen, sodass sich das nur auf die eine Zeile bezieht?
|
Re: Wörterbuch Datei
Zitat:
|
Re: Wörterbuch Datei
Delphi-Quellcode:
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
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; 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. |
Re: Wörterbuch Datei
Zitat:
|
Re: Wörterbuch Datei
Oh, da muss ich wohl das zweite .Text auch noch ersetzen...
|
Re: Wörterbuch Datei
Das macht auf jeden Fall Sinn, sonst wird die Datei "etwas" größer :lol:
|
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^^ |
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?
|
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... |
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.
|
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... |
Re: Wörterbuch Datei
Dann musst Du eben nachschauen, ob der gesuchte String enthalten ist. Sei doch mal etwas kreativ.
|
Re: Wörterbuch Datei
Delphi-Quellcode:
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?
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; 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 |
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:
MFG
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; |
Re: Wörterbuch Datei
Was sind ListeD und ListeE eigentlich?
Womöglich sollte man da man über BeginUpdate/EndUpdate nachdenken. |
Re: Wörterbuch Datei
Ich denke das sind die Listbox-Felder für die Ergebnisse.
MFG |
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? |
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ß. |
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 |
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?! |
Re: Wörterbuch Datei
Zitat:
![]() ![]() |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 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