Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Steuerzeichen (https://www.delphipraxis.net/162714-steuerzeichen.html)

Guido R. 2. Sep 2011 13:46

Steuerzeichen
 
Hallo !

Ich schreibe derzeit an einem Programm, dass anhand einer Paradox-Datenbank ein SQL-Scrip für den Import in ein anderes Programm erzeugen soll.
An wenigen Stellen werden aus der Paradox-DB Steuerzeichen aus einem (vermutlich defekten) Memo-Feld importiert. Ich habe versucht diese Steuerzeichen ( [NUL], [SI], [DC4], [EOT] ... ) aus dem Text auszufiltern.
Leider ohne großen Erfolg.

Zunächst habe ich versucht, alle Steuerzeichen mit Hilfe einer Funktion herauszufiltern :

Delphi-Quellcode:
function TMain.CleanText(S: String): String;
var i:Integer;
begin
 for i := 0 to 31
  do if (i<>10) AND (i<>13)
      then S:=StringReplace(S,CHR(i),'',[rfReplaceAll]);
 Result := S;
End;
Auch der direkte Aufruf mit
Delphi-Quellcode:
 {...}
 S:=StringReplace(S,CHAR(#0),'',[rfReplaceAll]);
 S:=StringReplace(S,CHAR(#4),'',[rfReplaceAll]);
 S:=StringReplace(S,CHAR(#20),'',[rfReplaceAll]);
 {...}
bzw.
Delphi-Quellcode:
 {...}
 S:=StringReplace(S,#0,'',[rfReplaceAll]);
 S:=StringReplace(S,#4,'',[rfReplaceAll]);
 S:=StringReplace(S,#20,'',[rfReplaceAll]);
 {...}
erbrachte nicht das gewünschte Ergebnis.

Einzig der Trim-Befehl brachte einen kleinen Erfolg. Dieser entfernte die Steuerzeichen, die sich am Anfang oder Ende des Strings befanden.
Befinden sich jedoch Steuerzeichen inmitten des Strings, so werden diese nicht entfernt.

Hat jemand eine Idee, wie ich ALLE Steuerzeichen entfernen kann ?

Gruß
Guido R.

DeddyH 2. Sep 2011 13:55

AW: Steuerzeichen
 
Es ist zwar kein großer Unterschied zu Deiner 1. Version, aber versuch doch mal (ungetestet):
Delphi-Quellcode:
function TMain.CleanText(const S: String): String;
var
  i, j: integer;
begin
  SetLength(Result, Length(S));
  j := 0;
  for i := 1 to Length(S) do
    if (Ord(S[i]) > 31) or (S[i] in [#10, #13]) then
      begin
        inc(j);
        Result[j] := S[i];
      end;
  SetLength(Result, j);
end;
[edit] Ich sehe gerade: Delphi 2010. AFAIK kann Paradox kein Unicode, könnte es damit zusammenhängen? Hast Du es auch einmal mit AnsiStrings probiert? [/edit]

Guido R. 2. Sep 2011 14:32

AW: Steuerzeichen
 
Dieses Projekt führe ich noch mit D2007 durch. Somit sollte Unicode eigentlich kein Problem sein...

Die Daten habe ich mir vorher in ein String gelesen

Delphi-Quellcode:
S := ParadoxTable.FieldByName('BLOEDESMEMO').AsString;


Ich probiere Deine Methode gleich mal aus...

Gruß
Guido R.

Guido R. 2. Sep 2011 17:14

AW: Steuerzeichen
 
Ich hab Deinen Vorschlag leicht abgewandelt, aber so funktioniert es tatsächlich ...

Delphi-Quellcode:
function TMain.CleanText(S: String): String;
var i:Integer;
begin
 Result := '';
 if Length(S)>0
  then for i := 1 to Length(S)
        do if (Ord(S[i]) > 31) or (S[i] in [#10, #13])
            then Result := Result+S[i];
 Result:=Trim(StringReplace(Result,'"','´´',[rfReplaceAll]));
end;
Thx !

Luckie 2. Sep 2011 17:24

AW: Steuerzeichen
 
Würdest du bitte deinem Thema noch einen aussagekräftigen Namen geben? Und für die Zukunft ein kleiner Hinweis: Titel aus nur einem Wort sind in den seltensten Fällen aussagekräftig.

DeddyH 2. Sep 2011 17:36

AW: Steuerzeichen
 
Und eine Kombination unserer beiden Codes dürfte schneller sein. Noch flotter ginge es dann wohl nur noch über Pointer.
Delphi-Quellcode:
function TMain.CleanText(const S: String): String;
var
  i, j: integer;
begin
  SetLength(Result, Length(S));
  j := 0;
  for i := 1 to Length(S) do
    if (Ord(S[i]) > 31) or (S[i] in [#10, #13]) then
      begin
        inc(j);
        Result[j] := S[i];
      end;
  SetLength(Result, j);
  Result:=Trim(StringReplace(Result,'"','´´',[rfReplaceAll]));
end;

sx2008 2. Sep 2011 19:52

AW: Steuerzeichen
 
Ich würde aus der Methode TMain.CleanText() dann noch eine normale Funktion machen,
da sie ja in keinen Zusammenhang mit der Klasse TMain steht.
Namensvorschlag:
Delphi-Quellcode:
function RemoveControlChars(const S: String): String;


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