AGB  ·  Datenschutz  ·  Impressum  







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

CSV-Datei mit /sb

Ein Thema von Harry Stahl · begonnen am 25. Sep 2018 · letzter Beitrag vom 27. Sep 2018
Antwort Antwort
Benutzerbild von p80286
p80286

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

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 09:50
Wenn man mit csv-Dateien hantiert, ist "Zeile" ein untauglicher Begriff. en Datensatz wird durch x0D0A (#13#10) begrenzt, es sei denn diese Zeichenkombination befindet sich zwischen zwei " dann handelt es sich um ein (text)Feld das einen mehrzeiligen Text enthält.

Eine csv-Datei mit dem Notepad zu öffnen oder sie in eine Stringliste einzulesen, ist nicht in jedem fall zuverlässig und eignet sich allenfalls, um einen Überblick zu erhalten.

Gruß
K-H

U.U. kann man auch andere Vereinbarungen bezgl. der Feld und Satz-seperatoren treffen, aber das ist Vereinbarungssache.
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector

Geändert von p80286 (26. Sep 2018 um 09:52 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.809 Beiträge
 
Delphi 12 Athens
 
#2

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 10:22
NotePad++ ist die bessere Lösung zur Fehlersuche in solchen Dateien. Da kann man sich die "Steuerzeichen" anzeigen lassen und sieht eigentlich sehr schnell was los ist.

Sherlock
Oliver
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#3

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 14:07
Was alles unter ".csv" so kursiert ist zwar nicht ganz zufällig, aber oft ist es nicht mal das Comma, aus Comma-Separated-Values, was man als Trenner findet.
[quote]..
As indicated by carriage return or linefeed characters, each line in the file is then appended in the list as a string.
..[quote]
http://docs.embarcadero.com/products...le@string.html

Auch da kann man sich über die Formulierung streiten, aber es wird jedenfalls beschrieben, das 2 verschiedene Zeichen als Delimiter des Zeilenendes akzeptiert werden.

Die Funktion tut also erstmal, was sie soll, oder?
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.603 Beiträge
 
Delphi 12 Athens
 
#4

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 14:39
Das ist hardcoded in TStrings.SetTextStr .

          while not (P^ in [#0, #10, #13]) do Inc(P);

Da die Methode aber virtuell ist, könntest du die überschreiben und durch einen für diesen Fall passenden Code ersetzen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von ergeka
ergeka

Registriert seit: 5. Mär 2010
Ort: Karlsruhe
33 Beiträge
 
Delphi 12 Athens
 
#5

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 16:15
Bei einem ähnlichem Fall lese ich die Fremddatei zuerst mit einem StringStream ein.
Der 'Roh-String' wird bearbeitet und kann dann der StringList übergeben werden.

Delphi-Quellcode:
  ASL := TStringList.Create;
  try
    StrStream := TStringStream.Create;
    try
      {.. hier reparieren wir die CRCRLF Orgie aus dem Textfile ..}
      StrStream.LoadFromFile(AFileName);
      RawSWData := StrStream.DataString;
      RawSWData := StringReplace(RawSWData,#13#13#10,'',[rfReplaceAll]);
      ASL.Text := RawSWData;
      //mit ASL arbeiten
    finally
      StrStream.Free;
    end;
  finally
    ASL.Free;
  end;
Gruß

Ralf
  Mit Zitat antworten Zitat
Benutzerbild von juergen
juergen

Registriert seit: 10. Jan 2005
Ort: Bönen
1.176 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 22:09
Hallo zusammen,

bis jetzt hatte ich das auch immer so gemacht wie Uwe es gezeigt hat. Dafür habe ich mir die original System.Classes.pas in den entsprechenden Projektordner kopiert und diese Unit dann angepasst.
Nachteil: Wenn ich mal eine neuere Delphiversionen einsetzen sollte, muss ich ggf. die System.Classes neu kopieren und bearbeiten.

Von daher gefällt mir der Ansatz von Ralf ganz gut.
Vorsichtshalber möchte ich nachfragen ob meine Deklaration von RawSWData so richtig ist (als string)?

RawSWData: string;
Vielen Dank!
Jürgen
Indes sie forschten, röntgten, filmten, funkten, entstand von selbst die köstlichste Erfindung: der Umweg als die kürzeste Verbindung zwischen zwei Punkten. (Erich Kästner)
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.603 Beiträge
 
Delphi 12 Athens
 
#7

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 22:19
bis jetzt hatte ich das auch immer so gemacht wie Uwe es gezeigt hat. Dafür habe ich mir die original System.Classes.pas in den entsprechenden Projektordner kopiert und diese Unit dann angepasst.
Das habe ich aber nicht so gemeint! Das würde ja bedeuten, daß sich dann alle TStringList im Projekt so verhalten. Eventuell muss man ja auch unterschiedliche CSV-Dateien mit anderen abstrusen Konventionen einlesen können. Für den konkreten Anwendungsfall hatte ich mir eher etwas wie dieses vorgestellt:
Delphi-Quellcode:
type
  TSoftBreakStringList = class(TStringList)
  protected
    procedure SetTextStr(const Value: string); override;
  end;

procedure TSoftBreakStringList.SetTextStr(const Value: string);
var
  P, Start: PChar;
  S: string;
begin
  if CompareStr(LineBreak, sLineBreak) <> 0 then begin
    inherited;
    Exit;
  end;

  BeginUpdate;
  try
    Clear;
    P := Pointer(Value);
    if P <> nil then begin
      while P^ <> #0 do begin
        Start := P;
        while not (P^ in [#0, #13]) do Inc(P);
        SetString(S, Start, P - Start);
        Add(S);
        if P^ = #13 then Inc(P);
        if P^ = #10 then Inc(P);
      end;
    end;
  finally
    EndUpdate;
  end;
end;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von ergeka
ergeka

Registriert seit: 5. Mär 2010
Ort: Karlsruhe
33 Beiträge
 
Delphi 12 Athens
 
#8

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 22:37
Von daher gefällt mir der Ansatz von Ralf ganz gut.
Vorsichtshalber möchte ich nachfragen ob meine Deklaration von RawSWData so richtig ist (als string)?

RawSWData: string;
Vielen Dank!
Hallo Jürgen,

ja, das ist bei mir als String deklariert.

Gruß

Ralf
  Mit Zitat antworten Zitat
Antwort Antwort


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 03:20 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 by Thomas Breitkreuz