Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi seek in textdateien (https://www.delphipraxis.net/24147-seek-textdateien.html)

ltsavar 16. Jun 2004 09:21


seek in textdateien
 
Hallo,

ich möchte in einer Textdatei eine bestimme Stelle finden und dann an diese Stelle etwas einfügen. Nun ist die Datei ziemlich groß d.h. mehrere 1000 Zeichen und ein String kann ja maximal 255 Zeichen beherbergen. Hat jemand eine Idee wie ich das realisieren kann? Die Funktion seek kann ich da ja leider auch nicht verwenden um dann an diese Stelle zuspringen vielleicht :( hat jemand eine Idee?

Gruß

Ingo

ibp 16. Jun 2004 09:46

Re: seek in textdateien
 
herzlich willkommen :dp:

du kannst die datei im ganzen einlesen und dann durchsuchen lassen oder du liest die datei zeilenweise ein, fügst dann den string ein und speicherst die datei .. spricht doch nichts dagegen
schau mal nach tmemo oder trichedit

gruß rené

Niko 16. Jun 2004 09:48

Re: seek in textdateien
 
Hallo,

Klick

ibp 16. Jun 2004 10:00

Re: seek in textdateien
 
also wie groß denn nun wirklich, mehrere 1000 zeichen muß nicht groß sein kann aber...

ltsavar 16. Jun 2004 10:14

Re: seek in textdateien
 
Hi erstmal danke für die antworten,

Zitat:

Zitat von ibp
also wie groß denn nun wirklich, mehrere 1000 zeichen muß nicht groß sein kann aber...

also so groß ist sie nicht 100kb, aber enthält halt ziemlich viele zeichen :/


Zitat:

Zitat von ibp

du kannst die datei im ganzen einlesen und dann durchsuchen lassen oder du liest die datei zeilenweise ein, fügst dann den string ein und speicherst die datei .. spricht doch nichts dagegen
schau mal nach tmemo oder trichedit

gruß rené

zeilenweise einlesen geht nicht. das ist nur eine zeile ohne carriage return. und wenn ich das nur in nen string einlese hab ich ja das problem mit den 255 Zeichen...
aber ok tmemo hab ich mir noch nicht angeguckt...

ich hatte das halt so probiert:
assignfile(f,Edit1.text);
reset(f);
read(f,readst);
.
.
.

und das geht ja so nicht...

Gruß Ingo

shmia 16. Jun 2004 10:59

Re: seek in textdateien
 
Zitat:

Zitat von ltsavar
ich möchte in einer Textdatei eine bestimme Stelle finden und dann an diese Stelle etwas einfügen.

Um es mal ganz klar zu sagen:
Man kann in Dateien nicht in der Mitte oder am Anfang Daten Einfügen!
Man kann nur:
  • die Datei komplett in den Speicher einlesen (z.B. mit TStrings), Daten einfügen und speichern (dabei wird die orginale Datei überschrieben)
    Sehr einfach zu programmieren
  • Datei ab der Einfügestelle bis Dateiende in RAM einlesen, einzufügende Daten schreiben, gespeicherte Daten aus RAM schreiben
  • Datei bis zu Einfügestelle lesen und in Datei B kopieren, Datei B mit einzufügende Daten beschreiben und Rest von Datei A nach Datei B anhängen. Anschliesend Datei A löschen, Datei B nach Datei A umbenennen
    Braucht (fast) keinen Speicher, aber langsam

ltsavar 16. Jun 2004 11:16

Re: seek in textdateien
 
Zitat:

Zitat von shmia
Zitat:

Zitat von ltsavar
ich möchte in einer Textdatei eine bestimme Stelle finden und dann an diese Stelle etwas einfügen.

Um es mal ganz klar zu sagen:
Man kann in Dateien nicht in der Mitte oder am Anfang Daten Einfügen!
Man kann nur:
  • die Datei komplett in den Speicher einlesen (z.B. mit TStrings), Daten einfügen und speichern (dabei wird die orginale Datei überschrieben)

Hallo shmia,

wenn du mir jetzt nur noch kurz sagst wie so ein Einlesen mit TStrings funktioniert wäre ich glücklich ...

Gruß Ingo

Spezi1980 16. Jun 2004 12:22

Re: seek in textdateien
 
Zitat:

zeilenweise einlesen geht nicht. das ist nur eine zeile ohne carriage return. und wenn ich das nur in nen string einlese hab ich ja das problem mit den 255 Zeichen...
aber ok tmemo hab ich mir noch nicht angeguckt...
Wieso Strings und 255 Zeichen?

Under Pascalzeiten war ein String auf 155 Zeichen beschränkt. In Delphi gibt es unter anderem den Datentyp Shortstring (der ist max 255 Zeichen groß) und den Datentyp AnsiString (der bis 2Gb groß sein kann).

Der Typ String ist dann je nach gesetztem Compilerschalter {$H+}/{$H-} ein Shortstring oder ein Ansistring.

Du kannst also problemlos alles in einen String einlesen und durchforsten.

TStrings ist eine art dynamisches Stringarray, in dem mehrere Strings gespeichert werden und für deinen fall eher weniger zu gebrauchen, da hier beim laden auch das carriage return auswertet wird.

Gruß Robert

ibp 16. Jun 2004 12:24

Re: seek in textdateien
 
versuchs mal damit...
Delphi-Quellcode:
Memo1.LoadFromFile(DateiName)
und übrigens gibt es hier eine tolle suche...

:-D

shmia 16. Jun 2004 12:26

Re: seek in textdateien
 
Zitat:

Zitat von ltsavar
wenn du mir jetzt nur noch kurz sagst wie so ein Einlesen mit TStrings funktioniert wäre ich glücklich ...

Nicht leichter als das: :mrgreen:
Delphi-Quellcode:
var
   liste : TStrings;
begin
   liste := TStringList.Create;
   try
      // Daten laden
      liste.LoadFromFile('lottozahlen.txt');
      if liste.Count >= 10 then
      begin
         // füge folgene Zeile an Zeilennummer 10 ein
         liste.Insert(10, '5 18 27 31 31 49');
         // ändere eine bestehende Zeile
         liste.Strings[9] := '*** '+liste.Strings[9] + ' // nur ein Kommentar';
         
      end;

      // lösche die ersten beiden Zeilen
      liste.Delete(0);
      liste.Delete(0);


      // speichern
      liste.LoadFromFile('lottozahlen.txt');
   finally
      liste.Free; // aufräumen
   end;
end;

ltsavar 16. Jun 2004 12:47

Re: seek in textdateien
 
Zitat:

Zitat von Spezi1980

Der Typ String ist dann je nach gesetztem Compilerschalter {$H+}/{$H-} ein Shortstring oder ein Ansistring.

Du kannst also problemlos alles in einen String einlesen und durchforsten.

TStrings ist eine art dynamisches Stringarray, in dem mehrere Strings gespeichert werden und für deinen fall eher weniger zu gebrauchen, da hier beim laden auch das carriage return auswertet wird.

Gruß Robert

Danke. Ich glaub das war die Information die ich gebraucht hab.
Wenn ich alles in einen String packen kann ist das super...

dann noch kurz ne ander frage...gibts ne möglichkeit nen float varibale in nen integer zuverwandeln?
so a la floattoint (gibts ja leider nicht)...

Gruß Ingo

Ultimator 16. Jun 2004 12:51

Re: seek in textdateien
 
da müsstest du vielleicht trunc nehmen, aber das schneidet die Nachkommastellen ab, glaub ich...

lume96 16. Jun 2004 13:00

Re: seek in textdateien
 
Zitat:

Zitat von ltsavar

ich hatte das halt so probiert:
assignfile(f,Edit1.text);
reset(f);
read(f,readst);
.
.
.

und das geht ja so nicht...

Gruß Ingo

Hab's zwar selbst nicht getestet, wüsste aber nicht, warum das nicht funktionieren sollte.

Ich hätte nämlich genau das getan, in etwas so :
Delphi-Quellcode:
procedure TForm1.CopyTextFile(const InFName,OutFName,findstr,insertstr : string);
var
   F1,
   F2: TextFile;
   Ch: Char;
   tmpstr : string;
   found : boolean;
begin

   AssignFile(F1, InFName);
   AssignFile(F2, OutFName);
   found := false;
   tmpstr := '';

   try
      Reset(F1);
      Rewrite(F2);

      
      while not Eof(F1) do
      begin
         // einlesen eines Chars
         Read(F1, Ch);
         

         if length(tmpstr) < length(findstr) then
            tmpstr := tmpstr + Ch
         else
            if tmpstr = findstr then
               found := true
            else
               tmpstr := copy(tmpstr,2,length(tmpstr)-1) + ch;
         
         //einfügen des textes
         if found then
         begin
            Write(F2,insertstr);
            found := false;
            tmpstr := '';
         end;
         // Char in Resultatdatei schreiben
         Write(F2, Ch);
      end;
   finally
      CloseFile(F2);
      CloseFile(F1);
   end;

end;
Aufruf wie folgt :
Delphi-Quellcode:
CopyTextFile('Ausgangsdateiname','Ergebnissdateiname','zu findende String','hinzuzufügende String');
Da hier jedes Zeichen separat eingelsen und wieder geschrieben wird, sollte die Zeilenlänge eigentlich keine Rolle spielen. (Wie gesagt, nicht getestet.)

Gruss Lutz

ltsavar 17. Jun 2004 10:55

Re: seek in textdateien
 
Zitat:

Zitat von Ultimator
da müsstest du vielleicht trunc nehmen, aber das schneidet die Nachkommastellen ab, glaub ich...

Genau das hab ich gebraucht. Danke..

Man man ich hab so ewig lang kein Delphi mehr gecoded dass ich das alles vergessen hab...

Gruß Ingo

ltsavar 17. Jun 2004 10:58

Re: seek in textdateien
 
Zitat:

Zitat von lume96

Hab's zwar selbst nicht getestet, wüsste aber nicht, warum das nicht funktionieren sollte.

Ich hätte nämlich genau das getan, in etwas so :


Aufruf wie folgt :
Delphi-Quellcode:
CopyTextFile('Ausgangsdateiname','Ergebnissdateiname','zu findende String','hinzuzufügende String');
Gruss Lutz

Naja ich brauchte dass schon in einem String weil ich da mehr mals was schreiben,löschen,einfügen will. Sonst wäre deine Möglichkeit auch gegangen.
Und auch das mit TStrings wäre nichts für mich weil dass ja wie gesagt nur eine lange Zeile ist in der Datei.

Trotzdem Danke für alle Antworten.

Gruß Ingo


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:25 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