Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   eBay Turbolister CSV einlesen (https://www.delphipraxis.net/87219-ebay-turbolister-csv-einlesen.html)

IngoD7 26. Feb 2007 20:47

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von bennle
Im Grunde mach ich das schon so, nur ich schreibe die Datei in ein Memo und lese dann die Zeilen aus. Aber nach eine gewissen Anzahl von Zeichen macht er trotzdem ein Zeilenumbruch

Bei 1024, nehme ich an. Das macht der Editor (Notepad) auch. Lese die Datei mal damit ein, da passiert dasselbe.
Was man dagegen unternehmen kann, weiß ich im Moment nicht. Habe die Geschichte hier jetzt nur überflogen.

Zitat:

Zitat von bennle
Zudem habe ich noch das Problem mit dem HTML Code!!! Denn dieser Beinhaltet manchmal das Trennzeichen!

Naja, dazu muss man halt wissen, wie eine CSV-Datei aufgebaut ist. Wenn das ; (das Trennzeichen in deiner csv-Datei) im Feld mit vorkommt, so ist das Feld in " eingeschlossen. Ist ein Feld in " eingeschlossen und es kommt ein " im Feld vor, so wird dieses gedoppelt.

Code:
Bsp ==> Zelle: "Ja"-Sager --> Zelle in Datei: """Ja""-Sager"
          Zelle: Auto;Bus   --> Zelle in Datei: "Auto;Bus"
          Zelle: ach;"nee"  --> Zelle in Datei: "ach;""nee"""
Ich habe Einleseroutinen in Klassen integriert, die das beherrschen. Aber auf die Schnelle einlesen können habe ich deine Datei auch nicht. :?

bennle 26. Feb 2007 21:15

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von IngoD7
Zitat:

Zitat von bennle
Im Grunde mach ich das schon so, nur ich schreibe die Datei in ein Memo und lese dann die Zeilen aus. Aber nach eine gewissen Anzahl von Zeichen macht er trotzdem ein Zeilenumbruch

Bei 1024, nehme ich an. Das macht der Editor (Notepad) auch. Lese die Datei mal damit ein, da passiert dasselbe.
Was man dagegen unternehmen kann, weiß ich im Moment nicht. Habe die Geschichte hier jetzt nur überflogen.

Zitat:

Zitat von bennle
Zudem habe ich noch das Problem mit dem HTML Code!!! Denn dieser Beinhaltet manchmal das Trennzeichen!

Naja, dazu muss man halt wissen, wie eine CSV-Datei aufgebaut ist. Wenn das ; (das Trennzeichen in deiner csv-Datei) im Feld mit vorkommt, so ist das Feld in " eingeschlossen. Ist ein Feld in " eingeschlossen und es kommt ein " im Feld vor, so wird dieses gedoppelt.

Code:
Bsp ==> Zelle: "Ja"-Sager --> Zelle in Datei: """Ja""-Sager"
          Zelle: Auto;Bus   --> Zelle in Datei: "Auto;Bus"
          Zelle: ach;"nee"  --> Zelle in Datei: "ach;""nee"""
Ich habe Einleseroutinen in Klassen integriert, die das beherrschen. Aber auf die Schnelle einlesen können habe ich deine Datei auch nicht. :?

Danke für die Aufklärung! Ich dachte mir schon das es mit dem Memo nur 1024 möglich ist. Mit RichEdit vorraussichtlich 2048.
Das mit dem HTML Code ist mir wirklich vorher nicht aufgefallen. Aber danke für die Aufklärung! Ich sehe natürlich trotzdem noch ein Problem beim Einlesen.
Muss ich denn die Datei in ein Memo schreiben? Oder gibt es eine Möglichkeit die Datei Zeile für Zeile auszulesen?

Es wundert mich wirklich, dass sich noch keiner damit befasst hat :wink:
Naja scheint man nicht oft zu brauchen.

MfG
Benny

Klaus01 26. Feb 2007 21:24

Re: eBay Turbolister CSV einlesen
 
Die Datei mußt Du nicht in ein Memo schreiben.

Zeileweises einlesen geht z.b. so:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
 EbayFile: TextFile;
 data:String;
 dataItems: TStringdynarray;
 i:Byte;
 r:Integer;

begin
 AssignFile(EbayFile,ExtractFilePath(ParamStr(0))+'./turbolister.csv');
 Reset(EbayFile);
 r:=0;
 While not eof(EbayFile) do
   begin
     ReadLn(EbayFile,data);
     dataItems:=explode(';',data);
     if r > StringGrid1.RowCount -1 then
       StringGrid1.RowCount:=r;
     for i:=1 to length(dataItems) -1 do
       begin
         if StringGrid1.ColCount < i then
           StringGrid1.ColCount:=i;
         StringGrid1.Cells[i,r]:=dataItems[i];
       end;
     Memo1.Lines.Add(data);
     inc(r);
   end;
 CloseFile(EbayFile);
end;
Der Code hat aber auch das Problem mit dem ; im HTML Code.

Mit Streams sollte das auch gehen, damit habe ich aber keine Erfahrungen.

Grüße
Klaus

bennle 26. Feb 2007 21:45

Re: eBay Turbolister CSV einlesen
 
Hmm,
mein Compiler kennt TStringdynarray nicht! Muss ich etwas einbinden?

ERLEDIGT!! Unit Types musste eingebunden werden :D
Danke


Gruß
Benny

bennle 26. Feb 2007 22:44

Re: eBay Turbolister CSV einlesen
 
Hi,
Also danke, ich denke mir reicht das nun für's erste!!
Hab zwar hier und da noch ein paar Probleme, aber ich denke die werde ich Meistern.
Wenn nicht, dann werde ich mich hier wieder im Board melden! Denn hier bekommt man einfach einen super Support. :thumb:

Hier meine Lösung für den HTML CODE im CSV
Delphi-Quellcode:
function CSVExplode(const Separator, S: string; Limit: Integer = 0): TStringDynArray;
var
  SepLen: Integer;
  F, P: PChar;
  ALen, Index: Integer;
begin
  SetLength(Result, 0);
  if (S = '') or (Limit < 0) then Exit;
  if Separator = '' then
  begin
    SetLength(Result, 1);
    Result[0] := S;
    Exit;
  end;
  SepLen := Length(Separator);
  ALen := Limit;
  SetLength(Result, ALen);

  Index := 0;
  P := PChar(S);
  while P^ <> #0 do
  begin
    F := P;
//Position des HTML Codes herausfinden!
    if pos('"',P) = 1 then
    begin
      P := AnsiStrPos(P, PChar('";'));
    end
    else
      P := AnsiStrPos(P, PChar(Separator));
//ENDE Position des HTML Codes herausfinden!

    if (P = nil) or ((Limit > 0) and (Index = Limit - 1)) then P := StrEnd(F);
    if Index >= ALen then
    begin
      Inc(ALen, 5);
      SetLength(Result, ALen);
    end;
    SetString(Result[Index], F, P - F);
    Inc(Index);
    if P^ <> #0 then Inc(P, SepLen);
  end;
  if Index < ALen then SetLength(Result, Index);
end;
Evtl sollte man noch die Anführungszeichen bei der HTML Zelle entfernen, allerdings weis ich den Befehl momentan nicht :P
Ist wohl schon zu spät.
Ebenfalls gibt es ein Problem, sobald ein Zeilenumbruch im HTML Text zu sein scheint!
Wenn jemand weiß, wie ich das regeln kann, dann bitte ich um Hilfe! Denn es kommt eine Zugriffsverletzung :(
Also Danke nochmal


Gruß
Benny

agm65 27. Feb 2007 12:08

Re: eBay Turbolister CSV einlesen
 
dafür habe ich mir auch was einfallen lassen, ich hatte genu das problem ...einfach einen stringreplace drüberlaufen lassen (also beim einlesen der einzelnen zeilen) die leerzeichen mit zb $%& füllen und später einfach umgekehrt ! das geht 100%


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:41 Uhr.
Seite 3 von 3     123   

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