Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zeilenumbrüche ins CSV-Format schreiben (https://www.delphipraxis.net/90604-zeilenumbrueche-ins-csv-format-schreiben.html)

capo 20. Apr 2007 13:01


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

mkinzler 20. Apr 2007 13:03

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Ersetze die Zeilenumbrüche durch andere Zeichen

shmia 20. Apr 2007 13:08

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Es gibt z.B. http://de.wikipedia.org/wiki/Quoted-printable
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.

capo 20. Apr 2007 13:18

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Es klappt, vielen Dank für eure Antworten.
Capo

capo 20. Apr 2007 18:09

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Zitat:

Ersetze die Zeilenumbrüche durch andere Zeichen
Noch eine Frage dazu, ich importiere das CSV-File in ein Stringgrid, bekomme daher auch das "andere Zeichen" mit angezeigt. Gibt es eine Möglichkeit das "andere Zeichen" überhaupt nicht anzuzeigen? Herausfiltern, es muss ja doch vorhanden sein.
Gruesse Capo

mkinzler 20. Apr 2007 18:11

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Sie werden mit angeszeigt, wenn du sie nicht wieder ersetzt oder OwnderDraw im Grid implementierst

capo 20. Apr 2007 21:31

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Zitat:

oder OwnderDraw im Grid implementierst
Wie geht das?
capo

mkinzler 20. Apr 2007 21:35

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Implementiere .onDrawCell

http://www.delphipraxis.net/internal...ell+stringgrid

capo 20. Apr 2007 22:37

Re: Zeilenumbrüche ins CSV-Format schreiben
 
Selbst dann wird das "andere Zeichen" doch im Stringgrid angezeigt, oder verstehe ich was falsch?
Gruss Capo

capo 20. Apr 2007 23:41

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;

Hansa 21. Apr 2007 01:42

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.

alzaimar 21. Apr 2007 06:54

Re: Zeilenumbrüche ins CSV-Format schreiben
 
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.

Sko 21. Apr 2007 08:53

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 Delphi-Referenz durchsuchenStringReplace machen? :gruebel:

alzaimar 21. Apr 2007 08:58

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.

capo 23. Apr 2007 12:14

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:
DecodeNonPrintable(Form1.StringGrid1.Cells[1, Form1.StringGrid1.Row]);
irgendwie passiert damit aber auch nichts.


Zitat:

Selbst dann wird das "andere Zeichen" doch im Stringgrid angezeigt, oder verstehe ich was falsch?
Gruss Capo

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

alzaimar 23. Apr 2007 14:03

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.

capo 23. Apr 2007 14:15

Re: Zeilenumbrüche ins CSV-Format schreiben
 
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.
schon klar und was ist damit?


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