(Moderator)
Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
Delphi 2007 Enterprise
|
Re: Zeilenumbrüche ins CSV-Format schreiben
21. Apr 2007, 07:54
Delphi-Quellcode:
Const
cEscape = '\';
cHexDigits = '0123456789ABCDEF';
Function EncodeNonPrintable(Const aString: String): String;
// Konvertiert alle Zeichen < #32 (sowie '\' selbst) in '\xx', wobei xx = Hex (c)
Var
c, i, n: Integer;
Procedure _AddChar(aChar: Char);
Begin
Inc(n);
Result[n] := aChar;
End;
Begin
// Schlimmstenfalls müssen alle Zeichen konvertiert werden
SetLength(Result, 3 * Length(aString));
n := 0;
For i := 1 To Length(aString) Do
If (aString[i] = cEscape) Or (aString[i] < #32) Then Begin
c := Ord(aString[i]); // '\xx' anhängen
_AddChar(cEscape);
_AddChar(cHexDigits[1 + c Shr $4]); // Hex-Code
_AddChar(cHexDigits[1 + c And $F]);
End
Else // Sonst das Zeichen anhängen
_AddChar(aString[i]);
SetLength(Result, n); // Finale Länge setzen
End;
Function DecodeNonPrintable(Const aString: String): String;
// Konvertiert alle '\xx' in einem Text zurück in c, wobei c = Char ($xx)
// Achtung! Es findet keine explizite Fehlerbehandlung statt.
Var
i, n, l: Integer;
c: Char;
Begin
l := Length(aString);
// Das Resultat kann nicht länger als der Ausgangsstring sein
SetLength(Result, l);
n := 0;
i := 0;
While i < l Do Begin
inc(i);
If aString[i] = cEscape Then Begin // Wenn nächstes Zeichen ein '\'
c := Char(StrToInt('$' + Copy(aString, i + 1, 2))); // Hex -> Char
inc(i, 2);
End
Else
c := aString[i]; // Ansonsten Zeichen kopieren
inc(n);
Result[n] := c;
End;
SetLength(Result, n); // Finale Länge setzen
End;
EncodeNonPrintable konvertiert die Sonderzeichen in '\xx', DecodeNonPrintable konvertiert sie wieder zurück.
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
|
|
Zitat
|