AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

CSV / ASCII-Delimited

Ein Thema von p80286 · begonnen am 16. Apr 2015 · letzter Beitrag vom 16. Apr 2015
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von p80286
p80286

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

CSV / ASCII-Delimited

  Alt 16. Apr 2015, 14:23
Hallo zusammen,
ichg habe eine .CSV-Datei erhalten, die nicht ganz "normgerecht" ist. Und zwar hat sie das folgende Format:
Code:
"feld1";"Feld2";"Feld3" [CRLF]
"feld1";"Feld2";"Feld3"[CRLF]
"feld1";"Feld2";"Feld3" [CRLF]
....
In einigen zeilen folgt also auf das " noch ein Leerzeichen, und dann erst das CRLF als Zeilenende. Wären die Felder nicht durch " begrenzt wäre es klar, das Leerzeichen gehört dazu. Da aber RFC4180 nur so von "may" wimmelt hätte ich gerne Eure Meinung zur korrekten Behandlung der Daten.
(Excel und Calc lesen das Leerzeichen übrigens mit)

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

Registriert seit: 13. Aug 2002
17.196 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 14:40
Frag doch den ersteller der CSV-Datei was damit gemacht werden soll
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 14:42
Da RFC4180 explizit von Comma-Separeted-Values spricht, ist das per se schon nicht normgerecht

Aber darauf ist dann auch gesch...en (mit ein bisserl Transferleistung).

Es wird sich dort leider nicht explizit dazu ausgelassen, ob ein Leerzeichen zulässig ist oder nicht und wenn ja, wie es behandelt werden soll.

Meine Vermutung ist allerdings, dass die Intention war, dass es nicht zulässig ist und die Schreibweise einfach nur unglücklich ist.

Statt
Code:
  1.   Each record is located on a separate line, delimited by a line
       break (CRLF). For example:

       aaa,bbb,ccc CRLF
       zzz,yyy,xxx CRLF
hätten die schreiben sollen
Code:
  1.   Each record is located on a separate line, delimited by a line
       break (CRLF). For example:

       aaa,bbb,ccc<CRLF>
       zzz,yyy,xxx<CRLF>
Denn sonst könnte man dort sogar ein Leerzeichen als zwingend vorgeschrieben ansehen.

Das die Intention war dort kein Leerzeichen zuzulassen, kann man hier raus erarbeiten
Code:
The ABNF grammar [2] appears as follows:

   file = [header CRLF] record *(CRLF record) [CRLF]

   header = name *(COMMA name)

   record = field *(COMMA field)
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 14:57
Vielleicht hilft dir das hier weiter:
Geschrieben für D7

Delphi-Quellcode:
// Deklarationen
Lines : array of TStrings;
procedure ReadCSV(AStrings : TStrings);

// Funktionen
procedure TForm1.ReadCSV(AStrings: TStrings);
var
  InString : boolean;

  CurrentLineIndex : integer;
  CurrentLine : string;

  CurrentCharIndex : integer;
  CurrentChar : char;

  StringBuffer : string;

  LLine : TStrings;
begin
  InString := False;
  StringBuffer := '';

  for CurrentLineIndex := 0 to AStrings.Count-1 do
  begin
    CurrentLine := AStrings[CurrentLineIndex];
    StringBuffer := '';
    LLine := TStringList.Create;

    for CurrentCharIndex := 1 to Length(CurrentLine) do
    begin
      CurrentChar := CurrentLine[CurrentCharIndex];

      if (not(InString)) and
         (CurrentChar = ' ') then
        Continue
      else if (not(InString)) and
              (CurrentChar = '"') then
      begin
        InString := true;
        Continue;
      end
      else if (InString) then
      begin
        if CurrentChar = '"then
        begin
          LLine.Add(StringBuffer);
          InString := false;
          StringBuffer := '';
          Continue;
        end;
      end;

      if (not(InString)) and
         (CurrentChar = ';') then
        Continue;

      StringBuffer := StringBuffer + CurrentChar;

      if StringBuffer = '[CRLF]then
      begin
        SetLength(Lines,Length(Lines)+1);
        Lines[Length(Lines)-1] := LLine;
        Break;
      end;
    end;
  end;
end;

procedure TForm1.btn1Click(Sender: TObject);
var
  LStrings : TStrings;
begin
  LStrings := TStringList.Create;
  LStrings := mmo1.Lines;
  ReadCSV(LStrings);
  ShowMessage(Lines[0][0]);
  ShowMessage(Lines[1][0]);
  ShowMessage(Lines[1][2]);
  ShowMessage(Lines[2][1]);
  ShowMessage(Lines[2][2]);
end;
Milos
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#5

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:01
@milos

Wenn es Unstimmigkeiten / unterschiedliche Lesarten der RFC4180 gibt, wie willst du dann einen Code schreiben, der exakt nach RFC4180 agiert?

Es geht hier nicht um irgendeinen Code sondern um das was die RFC4180 aussagt und ob die Daten nun RFC4180 konform sind oder nicht.

Wenn ich mit jemandem ausmache, dass er mir die Daten nach RFC4180 liefern soll, dann haue ich dem das so lange um die Ohren, bis es so ankommt wie RFC4180 das vorschreibt. Dazu müssen aber alle Beteiligten die RFC4180 gleich verstehen/lesen
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:02
Und was ist das Problem an der Ausgangsfrage?
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Benutzerbild von milos
milos

Registriert seit: 14. Jul 2008
Ort: Bern (CH)
509 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:04
@milos

Wenn es Unstimmigkeiten / unterschiedliche Lesarten der RFC4180 gibt, wie willst du dann einen Code schreiben, der exakt nach RFC4180 agiert?

Es geht hier nicht um irgendeinen Code sondern um das was die RFC4180 aussagt und ob die Daten nun RFC4180 konform sind oder nicht.

Wenn ich mit jemandem ausmache, dass er mir die Daten nach RFC4180 liefern soll, dann haue ich dem das so lange um die Ohren, bis es so ankommt wie RFC4180 das vorschreibt. Dazu müssen aber alle Beteiligten die RFC4180 gleich verstehen/lesen
Hab ich wohl überlesen, der Code von mir liest die Daten einfach so aus wie sie da sind, ohne ein RF-Ding zu beachten. Hab da wohl einfach drauf los ge-

Freundliche Grüsse
Milos
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:08
@Bernhard
Rat mal wie lange ich gebraucht habe um den Ersteller der Datei zu überreden einen nicht proportionalen Font zu nutzen damit er die Leerzeichen wenigsten etwas besser erkennt.
(Nein sie sind falsch!)

@Sir Rufo

Interpretationsfähig ist eben das
Zitat:
enclosed in double-quotes
.
Ich verstehe das als "wenn Anführungszeichen genutzt werden, dann befindet sich der vollständige Feldinhalt innerhalb der Anführungszeichen"
Code:
field = (escaped / non-escaped)

   escaped = DQUOTE *(TEXTDATA / COMMA / CR / LF / 2DQUOTE) DQUOTE

   non-escaped = *TEXTDATA
und dann sollte ich (Leer-)Zeichen zwischen Anführungszeichen und Feldtrenner ignorieren.

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

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:10
@milos

Wenn es Unstimmigkeiten / unterschiedliche Lesarten der RFC4180 gibt, wie willst du dann einen Code schreiben, der exakt nach RFC4180 agiert?

Es geht hier nicht um irgendeinen Code sondern um das was die RFC4180 aussagt und ob die Daten nun RFC4180 konform sind oder nicht.

Wenn ich mit jemandem ausmache, dass er mir die Daten nach RFC4180 liefern soll, dann haue ich dem das so lange um die Ohren, bis es so ankommt wie RFC4180 das vorschreibt. Dazu müssen aber alle Beteiligten die RFC4180 gleich verstehen/lesen
Hab ich wohl überlesen, der Code von mir liest die Daten einfach so aus wie sie da sind, ohne ein RF-Ding zu beachten. Hab da wohl einfach drauf los ge-

Freundliche Grüsse
Jupp, denn dein Code ist nicht RFC4180 konform.

Versuch einfach mal diese Daten zu verarbeiten:
Code:
1,"Das ist
eine Zeile"
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
taveuni

Registriert seit: 3. Apr 2007
Ort: Zürich
533 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: CSV / ASCII-Delimited

  Alt 16. Apr 2015, 15:11
Trotzdem: Wo liegt das eigentliche Problem? Diese Datei ist mit einer TStringlist ja einfach zu parsen.
Die obige Aussage repräsentiert meine persönliche Meinung.
Diese erhebt keinen Anspruch auf Objektivität oder Richtigkeit.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 04:39 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz