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
Seite 2 von 2     12   
Benutzerbild von ergeka
ergeka

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

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.174 Beiträge
 
Delphi 11 Alexandria
 
#12

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.452 Beiträge
 
Delphi 12 Athens
 
#13

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 juergen
juergen

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

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 22:28
@Uwe,

das hatte ich mir schon gedacht dass du das nicht so machst wie ich. Ich wusste es halt nicht besser.
Danke für dein Beispiel, somit habe ich wieder was gelernt!

Gute N8!
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 ergeka
ergeka

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

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
Benutzerbild von juergen
juergen

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

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 22:48
@Ralf,

danke für deine Antwort!

Gruß
Jürgen
Jürgen
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
 
Delphi 11 Alexandria
 
#17

AW: CSV-Datei mit /sb

  Alt 26. Sep 2018, 23:12
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;
Zur Info: Das Einlesen der Datei funktioniert auch mit dieser Variante, nur hat man danach natürlich keine Möglichkeit mehr, die Softbreaks, z.B. bei einem importierten Text für ein mehrzeiliges Memofeld zu setzen (da ja alle #10 beim Einlesen übergangen werden).
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: CSV-Datei mit /sb

  Alt 27. Sep 2018, 00:08
(da ja alle #10 beim Einlesen übergangen werden).
Hast du das probiert oder vermutest du das nur?
Wenn ich mich nicht täusche, werden nur die #10 übergangen, die nach einem #13 kommen. Alle anderen werden mit SetString in S übertragen.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Benutzerbild von Harry Stahl
Harry Stahl

Registriert seit: 2. Apr 2004
Ort: Bonn
2.533 Beiträge
 
Delphi 11 Alexandria
 
#19

AW: CSV-Datei mit /sb

  Alt 27. Sep 2018, 21:40
Ich hatte den Code wohl an einer Stelle falsch verstanden und hatte es aber auch zusätzlich probiert.

Zum Test hatte ich dann

memo1.lines.text = stringlist.text

probiert und gesehen, dass kein Zeilenumbruch im TMemo stattfand, daher ging ich davon aus, dass die #10 Zeichen entfallen wären.

Aber jetzt den Code noch mal genauer angesehen und nein, die #10 werden nicht überlesen.

Das TMemo verhält sich interessanterweise genau so wie Notepad, wenn man den Text so zuweist, wie oben von mir dargestellt.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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:24 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