AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi csv Datei Import ClassHelper für TClientDataSet

csv Datei Import ClassHelper für TClientDataSet

Ein Thema von MaBuSE · begonnen am 26. Okt 2011 · letzter Beitrag vom 24. Mai 2019
Antwort Antwort
Schokohase
(Gast)

n/a Beiträge
 
#1

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 22. Mai 2019, 17:48
Erkläre doch bitte, warum meine Testdaten nicht RFC konform sein sollten.

Wenn Daten aus einem System (Datenbank) exportiert werden, dann können sich wenigstens meine Kunden darauf verlassen, dass die Daten unverändert in der CSV Datei landen. Und wenn dort nur ein CR oder LF enthalten ist, dann kommt auch nur das heraus - und zwar 24 Stunden an allen 7 Tagen jeder Woche.

Der Zeilenumbruch mit CRLF ist Teil der Struktur und nicht der Daten.

Ich denke aber wir haben eine unterschiedliche Lesart der RFC. Meine deckt sich mit dem größten Teil der Entwickler und deine ... ist deine Sache.
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#2

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 23. Mai 2019, 11:24
https://tools.ietf.org/html/rfc4180

Ich vermute das #10 wird von Blackpit mißinterpretiert.

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
Blackpit

Registriert seit: 27. Feb 2019
77 Beiträge
 
#3

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 23. Mai 2019, 16:01
https://tools.ietf.org/html/rfc4180

Ich vermute das #10 wird von Blackpit mißinterpretiert.

Gruß
K-H
Dann klärt mich doch bitte auf, bevor wir weiter aneinander vorbeireden.
Das als Grundlage:
Zitat von http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/System_sLineBreak.html:
Windows systems define sLineBreak as a combination of carriage return (#13) and line feed (#10).
Linux systems define sLineBreak as simply a line feed (#10).
It is preferable to use this constabnt rather than hard code #13#10 or #10 (as appropriate) to move to a new line in a text output.
und ergänzt:
Apple systems define sLineBreak as simply a carriage return (#13).

Gruß
BP
  Mit Zitat antworten Zitat
Benutzerbild von MaBuSE
MaBuSE

Registriert seit: 23. Sep 2002
Ort: Frankfurt am Main (in der Nähe)
1.840 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: csv Datei Import ClassHelper für TClientDataSet

  Alt 23. Mai 2019, 17:35
Die ganze Diskussion ist hinfällig, da es keine einheitliche CSV Format gibt.
Zitat von Wikipedia:
Ein allgemeiner Standard für das Dateiformat CSV existiert nicht, jedoch wird es im RFC 4180 grundlegend beschrieben
Diese Beschreibung ist aber nur eine mögliche. Nach der Ansi Norm sind *.csv Dateien in unserem Sprachraum mit einem Semikolon getrennt.
Excel verwendet z.B. diese Ansi Norm. Mach mal einen Doppelklick auf eine mit Komma getrennte csv Datei.
Es macht also keinen Sinn hier über Implementierungsdetails streiten.

Folgendes Beispiel ist auch NICHT rfc konform:
Code:
MaBuSE,"Hauptstraße 5",12345,Musterstadt
(Das "ß" ist nicht erlaubt.)

Das Zeilenwechsel Problem ist ja auch kein CSV spezifisches Problem. Das gibt es grundsätzlich beim Austausch von Textdateien zwischen PC <-> Unix <-> alte Mac.

Ein Zeilenwechsel kann sein #13#10, #10 oder auch #13
Letzteres war früher bei Macs, ist aber mittlerweile unüblich.

TStringList kann auf PC vernünftig nur mit #13#10 umgehen. Je nachdem wie man die Daten zuweist, wird es auch nach #13#10 umgewandelt oder nicht.
Das ist aber auch schon ewig so.

Ich habe das nach dem Laden/Zuweisen immer mit einem sl.Text := sl.Text; gelöst. Damit werden alle #13 und #10 zu #13#10 umgewandelt.

Hier zum Testen: (Leeres Form mit einem TButton und 5 TMemo)
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  sl: TStringList;
begin
  sl := TStringList.Create;
  sl.Add('Aa,Bb');
  sl.Add('"A'#13#10'a",Bb');
  sl.Add('"A'#10'a",Bb');
  sl.Add('"A'#13'a",Bb');
  Memo1.Lines.Text := sl.Text; // mit Umwandlung von #13 und #10 nach #13#10
  Memo2.Lines.Add(sl.Text); // ohne Umwandlung
  Memo3.Lines.Text := s2hex(Memo1.Lines.Text);
  Memo4.Lines.Text := s2hex(Memo2.Lines.Text);
  Memo5.Lines.Text := s2Hex(sl.Text);
end;

function TForm1.s2hex(s: string): string;
var
  i: Integer;
begin
  for i := 1 to length(s) do
   begin
     Result := Result + IntToHex(Ord(s[i]),2) + #32;
   end;
end;
-> so sieht es dann aus:

Code:
Memo1:
Aa,Bb
"A
a",Bb
"A
a",Bb
"A
a",Bb

Memo2:
Aa,Bb
"A
a",Bb
"Aa",Bb
"Aa",Bb

41 61 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41    0A 61 22 2C 42 62 0D 0A 22 41 0D   61 22 2C 42 62 0D 0A       // sl.Text
41 61 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A       // sl.Text nach Text := Text
41 61 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A       // Memo1.Lines.Text
41 61 2C 42 62 0D 0A 22 41 0D 0A 61 22 2C 42 62 0D 0A 22 41    0A 61 22 2C 42 62 0D 0A 22 41 0D   61 22 2C 42 62 0D 0A 0D 0A // Memo2.Lines.Text mit zusätzlichem #13#10 am Ende (durch das Add)
(°¿°) MaBuSE - proud to be a DP member
(°¿°) MaBuSE - proud to be a "Rüsselmops" ;-)

Geändert von MaBuSE (23. Mai 2019 um 17:51 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:42 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