![]() |
Zeilenumbrüche ins CSV-Format schreiben
Hallo,
In einem Projekt sollen Datensätze ins CSV-Format exportiert bzw daraus importiert werden. Mein Problem, dabei ist, dass einige der Datenfelder auch mehrzeiligen Text enthalten können. Ich frage mich nun, welche Varianten es gibt, die Zeilenumbrüche ins CSV-Format zu schreiben, bzw. beim Importieren zu erkennen. Gruss vom Capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
Ersetze die Zeilenumbrüche durch andere Zeichen
|
Re: Zeilenumbrüche ins CSV-Format schreiben
Es gibt z.B.
![]() oder die Möglichkeit Zeilenumbrüche durch /r/n, wie in der Programmiersprache C/C++ üblich, zu ersetzen. Einen Standard gibt es beim CSV-Format nicht. Erzeuger und Konsument der CSV-Datei müssen über das verwendete Verfahren Bescheid wissen. |
Re: Zeilenumbrüche ins CSV-Format schreiben
Es klappt, vielen Dank für eure Antworten.
Capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
Zitat:
Gruesse Capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
Sie werden mit angeszeigt, wenn du sie nicht wieder ersetzt oder OwnderDraw im Grid implementierst
|
Re: Zeilenumbrüche ins CSV-Format schreiben
Zitat:
capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
|
Re: Zeilenumbrüche ins CSV-Format schreiben
Selbst dann wird das "andere Zeichen" doch im Stringgrid angezeigt, oder verstehe ich was falsch?
Gruss Capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
Hallo
Ich habe versucht folgendes zu machen um die Zeichen zu filtern, klappt aber nicht:
Delphi-Quellcode:
//Filter Liste zum sichern des Gridinhalt
var FilterList : TStringList; //Filter setzen procedure TForm1.SetFilter(ACol:Integer;Exp:String); var I,Counter:Integer; begin FilterList:=TStringList.Create; With StringGrid1 do begin //Filterliste mit Gridinhalt füllen For I := FixedRows To RowCount - 1 Do FilterList.Add(Rows[I].Text); //Grid filtern Counter:=FixedRows; For I := FixedRows To RowCount - 1 Do Begin If Cells[ACol,I] <> Exp Then Begin Rows[I].Clear; end Else begin If Counter <> I Then Begin Rows[Counter].Assign(Rows[I]); Rows[I].Clear; End; Inc(Counter); End; End; RowCount:=Counter; End; end; |
Re: Zeilenumbrüche ins CSV-Format schreiben
Das mit dem OnDrawCell ist keine gute Idee. Wie der Name "Draw" schon aussagt, da geht es lediglich um die Anzeige. Nach dem Motte "mache mir ein X für ein U". :zwinker: Man kann das also schon verwenden, um den Zelleninhalt X als U darzustellen. Glaube aber kaum, dass das was nützt. Der Zelleninhalt ist immer noch X ! Wie werden denn die Zellen konkret bestückt ? Das ist die Stelle, an der man ansetzen müsste. Zeilenumbruch-Zeichen auswerten, wie bereits gesagt. Also diese (siehe Link) in #10#13 zurück umwandeln.
|
Re: Zeilenumbrüche ins CSV-Format schreiben
Delphi-Quellcode:
EncodeNonPrintable konvertiert die Sonderzeichen in '\xx', DecodeNonPrintable konvertiert sie wieder zurück.
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; |
Re: Zeilenumbrüche ins CSV-Format schreiben
Ich weis nicht ob ich jetzt irgendwas wichtiges übersehen habe, aber könnte man das nicht einfach mit
![]() |
Re: Zeilenumbrüche ins CSV-Format schreiben
Könnte man: 31 mal. Aber dann ist es auch 30 mal langsamer (vorausgesetzt, o.g. Funktionen sind optimiert)
Derzeit möchte er eigentlich nur #10 und #13 konvertieren, aber wenn im String doch mal andere Zeichen vorkommen, wird's eng. Dann lieber so eine allgemeingültige Funktion und man hat seine Ruhe. |
Re: Zeilenumbrüche ins CSV-Format schreiben
Hallo alzaimar,
danke für dein beispiel. ich habe aber ehlich gesagt nicht ganz verstanden wie ich das für mich verwenden kann.
Delphi-Quellcode:
irgendwie passiert damit aber auch nichts.
DecodeNonPrintable(Form1.StringGrid1.Cells[1, Form1.StringGrid1.Row]);
Zitat:
das trennzeichen soll zwar nicht im stringgrid angzeigt werden aber... beim klick auf eine zeile im stringgrid muss der trennwert im string enthalten sein. gruss capo |
Re: Zeilenumbrüche ins CSV-Format schreiben
Na ja, das ist eine Funktion, die liefert einen Wert.
Du rufst Die Funktionen beim Speichern bzw. Laden des Inhaltes auf. |
Re: Zeilenumbrüche ins CSV-Format schreiben
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:21 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