![]() |
C-Like Formatfunktion
Gibt es eine fertige (performante) Funktion um C-Like (\n -> CRLF) Ersetzungen in einem String vornehmen zu können?
|
Re: C-Like Formatfunktion
Zitat:
Oder willst du nur eine Liste haben mit den möglichen Steuerzeichen? So nach dem Motto: \n \r \t \b \\ \0 etc? |
Re: C-Like Formatfunktion
Ich habe einen String aus einer Textdatei welchen ich entsprechend überarbeiten will.
Die Textdatei ist CSV-Datei die ich Tabelarisch einlesen will und hier will ich jetzt auch in einer Zelle mehrzeilige Text einlesen können wenn diese bei den entsprechenden Zellen mit "\n" gekennzeichnet sind. Nur CR bzw. LF kann ich nicht verwenden da ich u.U. die Datei von einem MAC bzw. Unix/Linux-System bekomme. Bisher musste in einem solchen Fall auf Excel zurückgegriffen werden. |
Re: C-Like Formatfunktion
Also brauchst du, wenn ich das richtig kapiere, eine Funktion die dir "\n" -> CRLF (beim lesen) wandelt, bzw. umgekehrt (beim schreiben in die Datei) ?
Am einfachsten geht das mit StringReplace... |
Re: C-Like Formatfunktion
Zitat:
|
Re: C-Like Formatfunktion
Ich verstehe dein Problem bei StringReplace nicht. Du sollst ja nicht ein einzelnes \ ersetzen sondern direkt \\. Also so (Pseudocode)
Code:
Out := StringReplace(In, '\n', cLineBreak, [rfIgnoreCase, rfReplaceAll]);
Out := StringReplace(Out, '\r', #13, [rfIgnoreCase, rfReplaceAll]); Out := StringReplace(Out, '\b', #8, [rfIgnoreCase, rfReplaceAll]); Out := StringReplace(Out, '\0', #0, [rfIgnoreCase, rfReplaceAll]); Out := StringReplace(Out, '\t', #9, [rfIgnoreCase, rfReplaceAll]); Out := StringReplace(Out, '\\', '\', [rfIgnoreCase, rfReplaceAll]); |
Re: C-Like Formatfunktion
Und was ist mit folgendem Fall:
"\\n" welcher z.B. in "C:\\Verzeichnis\\n1\\Sub1\\..." vorkommt? |
Re: C-Like Formatfunktion
Delphi-Quellcode:
Habs nicht getestet, aber das sollte eigentlich funktionieren...
function UnescapeC(const s: string): string;
var i, cidx: integer; inEscape: Boolean; procedure SpecialToChar(c: char): Char; begin case c of '0': result := #0; 'a': result := #7; 'b': result := #8; 't': result := #9; 'n': result := #10; 'v': result := #11; 'f': result := #12; 'r': result := #13; 'e': result := #27; end; end; begin if not assigned(s) or Length(s) < 2 then begin result := s; exit; end; cidx := 1; inEscape := false; SetLength(result, Length(s)); for i := 1 to Length(s) do begin case s[i] of '\': begin if inEscape then begin result[cidx] := '\'; Inc(cidx); end; inEscape := not inEscape; end; '0', 'a', 'b', 't', 'n', 'v', 'f', 'r', 'e': begin if inEscape then result[cidx] := SpecialToChar(s[i]); else result[cidx] := s[i]; Inc(cidx); inEscape := false; end; else result[cidx] := s[i]; Inc(cidx); end; end; SetLength(result, cidx-1); end; |
Re: C-Like Formatfunktion
Zitat:
|
Re: C-Like Formatfunktion
Zitat:
In der JCL gibt es die Funktion StrEscapedToString (Unit JclAnsiStrings). Gruß Patrick |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:48 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