Ich denke mal seine
CSV-Komponente kann mit Zeilenumbrüchen in Values nicht umgehen und trennt stattdessen dort das als Datensatz auf.
Mit folgendem Helper für
TTextReader
kann man das aber hinkriegen:
Delphi-Quellcode:
type
TTextReaderHelper = class helper for TTextReader
function CharCount(const ALine: string; AChar: Char): Integer;
procedure ReadQuotedLine(Target: TStrings);
end;
function TTextReaderHelper.CharCount(const ALine: string; AChar: Char): Integer;
var
C: Char;
begin
result := 0;
for C in ALine do begin
if C = AChar then
Inc(result);
end;
end;
procedure TTextReaderHelper.ReadQuotedLine(Target: TStrings);
var
line: string;
line2: string;
saveStrictDelimiter: Boolean;
begin
line := ReadLine;
if Odd(CharCount(line, Target.QuoteChar)) then begin
{ Eine ungerade Anzahl von Quotes bedeutet, daß der gequotete String mindestens einen Zeilenumbruch enthält.
Wir hängen also die nachfolgenden Zeilen mit LineBreak an, bis eine weitere Zeile mit ungerader Anzahl
Quotes kommt.
}
repeat
line := line + sLineBreak;
line2 := ReadLine;
line := line + line2;
until Odd(CharCount(line2, Target.QuoteChar));
end;
{ Zeilenumrüche in line dürfen nicht in separate Einträge zerlegt werden! }
saveStrictDelimiter := Target.StrictDelimiter;
try
Target.StrictDelimiter := True;
Target.CommaText := line;
finally
Target.StrictDelimiter := saveStrictDelimiter;
end;
end;
Nach dem
ReadQuotedLine enthält Target die Liste der Feldwerte, wobei Zeilenumbrüche in einem Wert erhalten bleiben.
Weil wenn ich die
CSV in einer Excel Tabelle öffne, dann macht der mir die Zeilenhöhe größer und die Tabelle ist dann unschön und schwer lesbar.
Tja, dann hilft dir mein Code leider auch nicht weiter. Oder doch, wenn du ihn dazu benutzt die Zeilenumbrüche zu entfernen. (RegEx wäre mir persönlich da jetzt zu kompliziert)