Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   #0 durch "nichts" ersetzen (https://www.delphipraxis.net/153737-0-durch-nichts-ersetzen.html)

Helmi 14. Aug 2010 09:32

#0 durch "nichts" ersetzen
 
Hallo,

ich habe folgenden Code:

Delphi-Quellcode:
  //FileStream und StringStream erzeugen
  FileStream   := TFileStream.Create(Datei, fmOpenRead);
  StringStream := TStringStream.Create(S);

  try
    //FileStream in StringStream kopieren
    FileStream.Position := 0;
    StringStream.CopyFrom(FileStream, FileStream.Size);

    //String aus StringStream auslesen
    S := StringStream.DataString;

    //#0 durch #32 ersetzen
    for i := 1 to length(S) do
      begin
        If S[i] = #0 then
          S[i] := #32;
      end;

    //Text in StringList laden
    SL_NCUpgrade.Text := S;
Dort ersetz ich #0 durch #32 (Leerzeichen)
Wie kann ich aber das #0 durch nichs ersetzen? - also komplett löschen?
Muss ich da wirklich mittels delete arbeiten?

mkinzler 14. Aug 2010 09:38

AW: #0 durch "nichts" ersetzen
 
Oder StringReplace()

Win32.API 14. Aug 2010 09:42

AW: #0 durch "nichts" ersetzen
 
Nicht getestet:
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      s[i] := c;
      inc(i);
    end;
  end;
  SetLength(sTmp, pred(i));

himitsu 14. Aug 2010 09:47

AW: #0 durch "nichts" ersetzen
 
Delphi-Referenz durchsuchenDelete

Win32.API 14. Aug 2010 10:04

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von RAD Studio VCL Reference Delete
If count specifies more characters than remain starting at the index, System::AnsiStringBase::Delete removes the rest of the string. If count is less than 0, no characters are deleted.

Also nicht sonderlich performant.

Helmi 14. Aug 2010 10:09

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von mkinzler (Beitrag 1042086)
Oder StringReplace()

StringReplace hört aber beim ersten #0 auf, meines Wissens nach

Zitat:

Zitat von Win32.API (Beitrag 1042087)
Nicht getestet:
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      s[i] := c;
      inc(i);
    end;
  end;
  SetLength(sTmp, pred(i));

mmh - eigentlich kein schlechtes Beispiel - hätt ich auch selbst drauf kommen können
werd ich mal ausprobieren
(wobei for ... in ... do in Delphi 7 noch nicht vorhanden ist)

Daniela.S 14. Aug 2010 11:02

AW: #0 durch "nichts" ersetzen
 
Delphi-Quellcode:
   str := StringReplace( str, #0, '', [rfReplaceAll] );

himitsu 14. Aug 2010 11:09

AW: #0 durch "nichts" ersetzen
 
StringReplace nutzt intern blöder Weise einen PChar-Pos, welches bei 0 endet und ignoriert die Längenangabe des Strings.

Also For+Delete oder das Schnellere von Win32.API oder eine PChar-Variante, welche auf die Längenangabe und nicht auf ein #0 hört.

DeddyH 14. Aug 2010 11:30

AW: #0 durch "nichts" ersetzen
 
Kleine Änderung (allerdings auch ungetestet):
Delphi-Quellcode:
  i := 0;
  SetLength(sTmp, Length(s));
  for c in s do
  begin
    if (c <> #0) then
    begin
      //erst erhöhen, sonst Zugriff auf String[0]
      inc(i);
      s[i] := c;    
    end;
  end;
  //jetzt müsste i der exakten Länge entsprechen
  SetLength(sTmp, i);

Helmi 14. Aug 2010 17:11

AW: #0 durch "nichts" ersetzen
 
Danke für eure Antworten!

Habs jetzt endgültig so gemacht:

Delphi-Quellcode:
    //String aus StringStream auslesen
    S_Data := StringStream.DataString;

    //String auf die Länge des Datenstrings setzen
    SetLength(S, length(S_Data));

    //#0 ausfiltern und in neuen String schreiben
    for i := 1 to length(S_Data) do
      begin
        If S_Data[i] <> #0 then
          begin
            inc(j);
            S[j] := S_Data[i];
          end;
      end;

    //wirkliche Größe des Strings setzen
    SetLength(S, j);

Bernhard Geyer 14. Aug 2010 23:04

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Helmi (Beitrag 1042084)
Dort ersetz ich #0 durch #32 (Leerzeichen)
Wie kann ich aber das #0 durch nichs ersetzen? - also komplett löschen?

Hört sich danach an das du eine Unicode-Textedatei vor dir hast. Bedenke das dein "schöne" Idee das €-Zeichen zerschießt!

Helmi 15. Aug 2010 10:13

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1042257)
Zitat:

Zitat von Helmi (Beitrag 1042084)
Dort ersetz ich #0 durch #32 (Leerzeichen)
Wie kann ich aber das #0 durch nichs ersetzen? - also komplett löschen?

Hört sich danach an das du eine Unicode-Textedatei vor dir hast. Bedenke das dein "schöne" Idee das €-Zeichen zerschießt!

Nein, nein :-)

Ich hab keine Unicode-Textdatei vor mir!
Ich hab eine Datei aus einer Siemens-Steuerung, die ich versuche auszulesen.
Und diese hat lauter #0´s drin.

Bernhard Geyer 15. Aug 2010 22:11

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Helmi (Beitrag 1042283)
Ich hab eine Datei aus einer Siemens-Steuerung, die ich versuche auszulesen.
Und diese hat lauter #0´s drin.

Wird das gleiche sein. Die Steuerungsdatei speichert Texte als Unicodestrings.

Helmi 16. Aug 2010 05:13

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1042433)
Zitat:

Zitat von Helmi (Beitrag 1042283)
Ich hab eine Datei aus einer Siemens-Steuerung, die ich versuche auszulesen.
Und diese hat lauter #0´s drin.

Wird das gleiche sein. Die Steuerungsdatei speichert Texte als Unicodestrings.

Interessant dass du die Datei besser kennst als ich!
Aber ich muss dir wiederrum wiedersprechen, das ist keine UniCode-Datei!
Und die Texte werden auch nicht als Unicode-Strings gespeichert!

alzaimar 16. Aug 2010 06:32

AW: #0 durch "nichts" ersetzen
 
Hier noch eine Version, die direkt auf dem String arbeitet:
Delphi-Quellcode:
j:=0;
For i:=1 to Length(s) do
  if s[i]<>#0 then begin
    inc(j);
    s[j] := s[i];
  end;

SetLength (S,j);

Bernhard Geyer 16. Aug 2010 07:54

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Helmi (Beitrag 1042442)
Interessant dass du die Datei besser kennst als ich!
Aber ich muss dir wiederrum wiedersprechen, das ist keine UniCode-Datei!
Und die Texte werden auch nicht als Unicode-Strings gespeichert!

Und Siemens Implementiert ihre Software so das Datei immer mit 0-Bytes an jeder zweiten Stelle gespeichert werden - Ist ja auch einfacher zu implementieren.

Aber kannst du dafür sorgen das das €-Zeichen in der Datei liegt? Damit könnte man Unicode ausschließen.

Helmi 16. Aug 2010 15:54

AW: #0 durch "nichts" ersetzen
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1042460)
Zitat:

Zitat von Helmi (Beitrag 1042442)
Interessant dass du die Datei besser kennst als ich!
Aber ich muss dir wiederrum wiedersprechen, das ist keine UniCode-Datei!
Und die Texte werden auch nicht als Unicode-Strings gespeichert!

Und Siemens Implementiert ihre Software so das Datei immer mit 0-Bytes an jeder zweiten Stelle gespeichert werden - Ist ja auch einfacher zu implementieren.

Aber kannst du dafür sorgen das das €-Zeichen in der Datei liegt? Damit könnte man Unicode ausschließen.

Das €-Zeichen liegt mit 100%iger Sicherheit nicht in der Datei!

himitsu 16. Aug 2010 16:11

AW: #0 durch "nichts" ersetzen
 
Dennoch wäre es wohl einfacher/sicherer, den Text in einen WideString zu kopieren oder nach Ansi umzuwandeln MSDN-Library durchsuchenWideCharToMultiByte

Helmi 16. Aug 2010 16:24

AW: #0 durch "nichts" ersetzen
 
Lieber nicht,

da ich die Daten so wie sie abgelegt sind brauche und lieber unverändert/unverwandelt lasse.
(Sonst gibts Schläg von meinen Kollegen, und wer will mir das schon antun?)

himitsu 16. Aug 2010 16:36

AW: #0 durch "nichts" ersetzen
 
Also doch WideString, denn beim Löschen/Ersetzen der #0 veränderst du das ja. :zwinker:


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