AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Sprachen und Entwicklungsumgebungen Sonstige Fragen zu Delphi Delphi im FileStream bestimmte Zeichen ersetzen

im FileStream bestimmte Zeichen ersetzen

Ein Thema von fips0705 · begonnen am 3. Jun 2009 · letzter Beitrag vom 5. Jun 2009
Antwort Antwort
Seite 1 von 2  1 2   
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#1

im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 15:41
ich habe mit
TFileStream.Create(opendialog1.filename, fmOpenReadWrite or fmShareDenyWrite) eine Datei gelesen und möchte nur im Stream bestimme Zeichen wie z.B. Hex 00 durch Leerzeichen ersetzen

mit der Funktion StringReplace funktioniert das im Filestream nicht
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.616 Beiträge
 
Delphi 11 Alexandria
 
#2

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 15:47
Handelt es sich um eine Textdatei? Dann würde ich keinen TFileStream benutzen.

Was du bei einem FileStream machen kannst wäre z.B. byteweise ein Byte lesen, vergleichen und ggf. die Position ein Byte zurücksetzen und das Ersatzbyte schreiben. Das wäre aber sehr langsam.

Was sinnvoll ist, hängt vom Dateityp und der Dateigröße ab. Möglich wäre z.B. den Inhalt in einen String oder Bytearray zu kopieren, usw.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#3

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 15:53
Es ist im Prinzip eine Textdatei, Sie enthält aber Drucksteuerzeichen. Das bewirkt, das es mit einer Stringlist oder auch Memoliste nicht funktioniert. Hier wir immer nur ein Teil gelesen.

Habe es auch schon mit BlockRead versucht.

Leider weiß ich nicht wie ich die komplette Datei einlese und dann von Anfang bis Ende die Datei durchsuche.
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.198 Beiträge
 
Delphi 10.4 Sydney
 
#4

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 15:59
Zitat von fips0705:
Es ist im Prinzip eine Textdatei, Sie enthält aber Drucksteuerzeichen.
Bist du dir sicher das es nicht eine Unicode-Textdatei ist? Was sagt notepad dazu wenn du es damit öffnest?
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#5

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 16:05
M F Bitte bei der Zahlung angeben

so sieht die Datei mit notepad aus.
lässt sich aber komplet öffnen
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#6

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 16:05
Mit den beiden folgende Funktionen kannst du die komplette Datei als String einlesen, verändern und wieder speichern (am Besten unter einem anderen Dateinamen).
Wenn deine Datei ~ 10 Megabytes überschreitet musst du dir Gedanken machen, nur Teile der Datei einzulesen und zu manipulieren.
So aber ist es am Einfachsten: alles in den Speicher lesen, verändern, zurückschreiben.

Delphi-Quellcode:
// kopiert aus der JCL
function FileToString(const FileName: string): AnsiString;
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
  finally
    fs.Free;
  end;
end;

procedure StringToFile(const FileName: string; const Contents: AnsiString);
var
  fs: TFileStream;
  Len: Integer;
begin
  fs := TFileStream.Create(FileName, fmCreate);
  try
    Len := Length(Contents);
    if Len > 0 then
      fs.WriteBuffer(Contents[1], Len);
  finally
    fs.Free;
  end;
end;
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.122 Beiträge
 
Delphi 12 Athens
 
#7

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 3. Jun 2009, 16:32
du kannst die komplette Datei vom Stream kurz in einen Puffer laden, darin die Zeichen ersetzen und dann zurück in en Stream, oder eben Stückchenweise (Byteweise oder in größeren Stückchen)

man könnte auch auch 2 Streams nutzen ... mit einem Stream aus der Datei lesen, dann da stückchenweise raus, bearbeiten und in den anderen stream rein

und statt die Datei danach wieder zurück in den Stream zu schicken, könnte man sie auch gleich im Puffer (z.B. einem String) belassen (siehe shmia)
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PosEx im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#8

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 4. Jun 2009, 07:41
vielen Dank für die vielen Tipps.
nur weiß ich nicht wie ich in einem Strem bzw. Puffer Zeichen ersetzte.
welchen Befehl kann ich dafür benutzen.
  Mit Zitat antworten Zitat
Satty67

Registriert seit: 24. Feb 2007
Ort: Baden
1.566 Beiträge
 
Delphi 2007 Professional
 
#9

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 4. Jun 2009, 07:52
Stell Dir den Stream als großes Byte-Array vor. Du kannst nur nicht direkt darauf zugreifen, sondern musst einzelne Byte (oder Byteblöcke) mit Stream.Methoden lesen/schreiben
Delphi-Quellcode:
Stream.Read(aByte, SizeOf(aByte))
Stream.Write(aByte, SizeOf(aByte))
Also im Prinzip nach dem öffnen zweier Streams aus dem einen ein Byte lesen... prüfen und evtl. anderen Wert zuweisen... dann Byte in zweiten Stream schreiben.
  Mit Zitat antworten Zitat
fips0705

Registriert seit: 13. Sep 2006
45 Beiträge
 
#10

Re: im FileStream bestimmte Zeichen ersetzen

  Alt 4. Jun 2009, 11:13
Ich habe es jetzt so gelöst vielen Dank

Delphi-Quellcode:
function FileToStringErsetze(const FileName: string;NeueZeichen: string;zuErsetzendeZeichen:integer): AnsiString;
var
  fs: TFileStream;
  Len,j: Integer;
  temp: string;

begin
  fs := TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite);
  try
    Len := fs.Size;
    SetLength(Result, Len);
    if Len > 0 then
      fs.ReadBuffer(Result[1], Len);
      for j := 1 to Len do
        if Ord(Result[j]) = zuErsetzendeZeichen then
          Temp := Temp + NeueZeichen
        else
          Temp := Temp + Result[j];

  finally
    Result:=Temp;
    fs.Free;
  end;
end;

Aufruf über
Delphi-Quellcode:
  SL := TStringList.create ;
  SL.add(FileToStringErsetze(opendialog1.filename,'|',00));
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz