![]() |
string kommt in datei vor?
hoi,
wenn ich per f: file; ... assignfile(f, pfad) eine datei in die variable lade, wie kann ich prüfen ob da eine bestimmte zeichenkette drin ist mit pos? f ist ja kein string |
Re: string kommt in datei vor?
Stimmt f nicht aber ...
... F: Textfile; test: string; du solltest die Textdatei mit reset(F) öffnen dann mit ...Readln(f, test); auslesen! "test" ist ein string! |
Re: string kommt in datei vor?
Hallo!
Da sehe ich 2 Möglichkeiten - die klassische Methode und das Windows-kompatible Verfahren. Bei der klassischen Methode wird die Datei zeilenweise mit Readln eingelesen und das Ergebnis mit Pos durchsucht, bis entweder der Suchstring gefunden wurde oder die Datei zu Ende ist. Dieses Verfahren entspricht allerdings nicht der Windows-Norm - allerdings geht Dein Ansatz (AssignFile) bereits in diese Richtung. Nach Windows-Norm muß die Datei komplett in den Speicher eingelesen werden (wenn der knapp wird, beginnt Windows dann das Ganze wieder auf die Platte auszulagern - fröhliches Warten allerseits :mrgreen:). Dazu sollte die Datei z.B. mit LoadFromFile in eine Stringlist eingelesen werden. Wenn ich so etwas zu programmieren habe, bevorzuge ich auch eindeutig die Nicht-Windows-Methode! Wird aber bei .NET wohl nicht mehr gehen. Kein Wunder, daß die Hauptspeicheranforderungen der Programme immer größer werden. Bei 2GB Hauptspeicher ist dann (XP) Ende der Fahnenstange. Wieviel Hauptspeicher unterstützt eigentlich Longhorn? Gruß Dietmar Brüggendiek Edit: Mist - zu langsam. Ich sollte nicht so viel zu Windoof schreiben :mrgreen: |
Re: string kommt in datei vor?
Zitat:
mfG mirage228 |
Re: string kommt in datei vor?
Eine 64-Bit CPU kann theorethitsch ca. 16.800.000.000 Gigabyte adressieren.
Das macht dann ungefähr 16 Exabyte. Frage: Wer braucht sowas? :lol: |
Re: string kommt in datei vor?
hm es handelt sich um eine DLL, wenn ich sie in eine stringlist lade ist da nur ein item mit 2 zeichen.... :(
Delphi-Quellcode:
procedure TForm1.FormShow(Sender: TObject);
var sl: tstringlist; i: integer; begin sl := tstringlist.create; sl.LoadFromFile(pfad); <<< DLL Pfad for i := 0 to sl.count-1 do begin if pos(ww, sl.Strings[i]) > 0 then begin StatusBar1.Panels[0].Text := 'Current server: Westwood'; exit; end else begin if pos(wu, sl.Strings[i]) > 0 then begin StatusBar1.Panels[0].Text := 'Current server: CNCR'; exit; end; end; end; sl.Free; end; eine der beiden if abfragen stimmt 100% zu...da ich aber nur 1 item erhalte... die DLL selber hat mehr als 100 |
Re: string kommt in datei vor?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo Pseudemys Nelsoni,
mit TStringList kann es auch nicht funktionieren, da binäre Dateien Steuerzeichen usw. enthalten. Du kannst die DLL mit einem TFilestrema öffnen. Dafür habe ich dir ein rudimentäres Beispiel gebastelt. Das Programm kommt mit jedem Dateiformat klar. Der Suchalgorithmus ist natürlich lausig (funktioniert aber). Hier kannst Du dann noch einiges optimieren |
Re: string kommt in datei vor?
hallo jens 8)
funzt, leider habe ich noch nie mit zeigern gearbeitet und versteh den code nicht so recht ich dachte man kann einfach eine datei in einen string laden mit mit pos prüfen ob ein string enthalten ist, alles nicht so leicht :( |
Re: string kommt in datei vor?
hm, ich bekomme es einfach nicht hin, ich bekomme es nichtmal hin eine mesage anzuzeigen ob der string nun vorkam oder nicht, ich weiss ehrlich gesagt nichmal wo ich anfangen soll. das beispiel von jens ist super, aber von dem code den ich da gelesen hab versteh ich nicht wirklich viel :\.
Wie könnt ich das z.b machen, ich möchte in einer DLL prüfen ob "hallo" vorkommt, wenn ja, dann Showmessage('ja'); sonst Showmessage('nein'); leider weiss ich nicht wie ich jetzt anfangen soll :? |
Re: string kommt in datei vor?
Delphi-Quellcode:
Das ist doch schon alles. Wenn du dein 'Hallo' in der DLL blablub.dll finden willst:
function TForm1.SearchForStringInDLL(const DLLFilename, aText: String): Integer;
{Quick and Dirty SuchAlgo für Zeichenketten in einer binären Datei D.h. es muss nicht unbedingt eine DLL sein. Es funktioniert mit jedem Dateiformat. Wenn der SuchText nicht gefunden wurde, gibt die Funktion -1 zurück.} var Filestream : TFilestream; HelpStr : String; ReadLen : Integer; TextLen : Integer; begin Result:=-1; // Default Ergebnis ReadLen:=Length(aText); // Wieviel Bytes sollen aus dem Stream gelesen werden SetLength(HelpStr,ReadLen); // Hilfsvariable auf die Länge des Suchtextes setzen TextLen:=ReadLen; // Länge des Suchtextes merken Filestream:=TFilestream.Create(DLLFilename,fmOpenRead); // Stream öffnen Try Filestream.Seek(0,soFromBeginning); // Position sicherheitshalber auf den Anfang setzen While Filestream.Position<Filestream.Size do begin Filestream.Read(Pointer(HelpStr)^,ReadLen); // ReadLen Zeichen aus dem Stream lesen ListBox1.Items.Add(HelpStr); // Für Testzwecke Label5.Caption:=IntToStr(Filestream.Position); Application.ProcessMessages; // Für Testzwecke {ReadLen enthält nach Filestream.Read die Anzahl der gelesen Zeichen. Wenn am Ende nicht TextLen Zeichen gelesen wurden wurde das Dateiende erreicht und der gesuchte String kann nicht enthalten sein} If Readlen=TextLen then begin If HelpStr=aText then // SuchText gefunden begin {Von der aktuellen Position, die jetzt ein Zeichen hinter dem SuchText steht wird jetzt die Länge des SuchTextes abgezogen. Dann steht in Result die Position des ersten Zeichenes des SuchTextes} Result:=Filestream.Position-TextLen; Exit; end else {Nicht gefunden. D.h. Position auf das nächste Zeichen setzen. Da die aktuelle Position ein Zeichen hinter den gelesenen Zeichen ist, muss (TextLen-1) Zeichen im Strema nach "links" gegangen werden, damit die neue Position für Filestream.Read ein Zeichen hinter der letzten Position ist. Aber nur, wenn noch TextLen Zeichen gelesen werden können.} If (Filestream.Position+TextLen)<Filestream.Size then Filestream.Seek(-(TextLen-1),soFromCurrent); end; end; Finally Filestream.Free; end; end;
Delphi-Quellcode:
if SearchForStringInDLL('blablub.dll', 'Hallo') > -1 then
ShowMessage('Gefunden.') else ShowMessage('Verdammt, wieder nichts.'); |
Re: string kommt in datei vor?
ahhh, danke. Ich habe den code in einem button eingefügt gehabt, sehe jetzt erst das man die function aufrufen muss :oops:
|
Re: string kommt in datei vor?
Hallo Luckie,
was ist wenn die Datei 20 30 oder 50MB gross ist? Da sucht sich dein Prog den Wolf. Bei uns gibts Zeichnungen, bei denen Text ersetzt werden muss, die sind zum Teil noch viel grösser ( nur um dem Kommentar 'so grosse dateien gibts nicht' vorzubeugen ). Ich halte viel davon möglichst grosse Stücke ins Ram zu holen. Was ist mit doppelt vorkommenden Zeichenketten? Ich hab in deiner Routine nicht genau nachgesehen, aber was ist mit Nullen in der Datei? Sobald du irgendwo Null-terminierte Strings benutzt und Nullen in deiner Datei vorkommen ist es Essig mit deiner Suchroutine. Damits nicht heisst der kann nur meckern stelle ich demnächst meine eigene Routine vor. Sorry für die Kritik ( bin aber selber reingefallen ) Rainer |
Re: string kommt in datei vor?
Hallo Rainer,
der Source ist aus meinem Beispiel. Es ist mit klar das der Algorithmus für sehr große Dateien nicht zu gebrauchen ist. Deshalb hae ich auch folgendes geschrieben: Zitat:
Text nicht in der DLL vorkommt benötigt der Algorithmus auf einem P4 / 3GHz ca 1 sek. Das ist verdammt lange. Wenn es meine Aufgabe wäre, würde ich jetzt versuchen mit dem Boyer/Moore Ansatz weiterzukommen. Sinn und Zweck des Beispiels ist es zu zeigen, dass für solch eine Aufgabe Streams verwenden werden sollten. Null terminierte Strings sind kein Problem. Sehr große Dateien würde ich auch blockorientiert verarbeiten. |
Re: string kommt in datei vor?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
ist Problem hat mich jetzt doch interessiert. Ich habe ein altes Projekt gefunden, in dem in den Boyer/Moore Algorithmus verwendet habe. (Quelle: Robert Sedgewick Algorithmen Addison Wesley 2. Auflage) Super Buch. Ich habe das Programm entsprechend erweitert. Die procedure SearchStr realisiert den Suchalgorithmus. SearchStr findet alle Vorkommen des gesuchten Textes. SearchStr ist erheblich schneller als SearchForStringInDLL. Rechts neben Ticks steht die Anzahl der Windows-Ticks (GetTickCount) die der jeweilge Algorithmus benötigt hat. Ich hoffe, dass ich den Source ausreichend kommentiert habe. Zu Thema Boyer/Moore habe ich noch eine Powerpoint-Datei angehängt. Ach ja, in der Datei Test.txt kann z.B. nach DELPHI gesucht werden. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:05 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