Delphi-PRAXiS

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)

bennle 25. Feb 2007 12:44


eBay Turbolister CSV einlesen
 
Hallo,
Ich möchte eine CSV Datei in mein Programm laden.
Vorher habe ich die Datei in ein Memo geladen, jedoch festgestellt dass er ohne Erlaubnis des Zeilenumbruchs trotzdem alles auf 3 Zeilen aufteilt.
Ich hab dann etwas im Forum gesucht und bin auf JvCSVData gestoßen. Dies scheint auch wirklich komfortabler zu sein und eine echt klasse Erweiterung.
Jedoch stelle ich nun fest, dass dieses CSVData nur 120 Zellen unterstützt. :evil:
Hat jemand eine Idee wie ich diese Datei dennoch verarbeiten kann? Ich muss diese Datei unbedingt einlesen. Es wäre auch ok, wenn er mir den Rest nicht ausliest, dafür aber die 120 Zellen!

Für eine Lösung wäre ich dankbar.

Gruß
Benny

PS: Ich verwende derzeit Delphi7

mkinzler 25. Feb 2007 12:49

Re: eBay Turbolister CSV einlesen
 
Schau dir mal kbMemTable an

bennle 25. Feb 2007 12:53

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von mkinzler
Schau dir mal kbMemTable an

Hmm, ich kann mir das mal anschaun. Allerdings sehe ich das es keine freie Komponente ist und ich eine Lizenz benötige. Oder irre ich mich?

Gruß
Benny

PS: Gibts auch etwas als OpenSource?

CK_CK 25. Feb 2007 12:56

Re: eBay Turbolister CSV einlesen
 
Guck' dir mal diese Komponente an: [KLICK]
Vielleicht ist das ja was für dich (Ist FreeWithSource) ;)

Ansonsten sind [HIER] noch mehr Komponenten in dieser Richtung...

Chris

mkinzler 25. Feb 2007 12:56

Re: eBay Turbolister CSV einlesen
 
Es gab mal ne freie Version, die gibt es wohl nicht mehr :(
Aber $15 geht ja. Sonst könntes du dir mal die Sourcen von JcCSVDataSet anshauen, warum er nur 120 Zellen schafft.

bennle 25. Feb 2007 14:18

Re: eBay Turbolister CSV einlesen
 
Wie verwende ich denn den
CSV Parser v.1.0.1.2 ???

@mkinzer
Leider habe ich nicht genügend Erfahrung im Programmieren, dass ich herausfinden könnte, warum nur 120 Zeilen unterstützt werden.

Gruß
Benny

marabu 25. Feb 2007 14:33

Re: eBay Turbolister CSV einlesen
 
Hallo Benny,

du möchtest eine CSV-Datei zur Betrachtung in dein Programm laden? Du kannst das mit einer ListView und StringGrids machen, falls du den CSVDataSet aus irgendwelchen Gründen nicht einsetzen kannst. Ein Beispiel findest du hier: klick

Die TurboLister Austauschdateien haben laut eBay 102 Spalten - nicht 120.

Freundliche Grüße

bennle 25. Feb 2007 14:57

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von marabu
Hallo Benny,

du möchtest eine CSV-Datei zur Betrachtung in dein Programm laden? Du kannst das mit einer ListView und StringGrids machen, falls du den CSVDataSet aus irgendwelchen Gründen nicht einsetzen kannst. Ein Beispiel findest du hier: klick

Die TurboLister Austauschdateien haben laut eBay 102 Spalten - nicht 120.

Freundliche Grüße

Hallo,
Hmm leider stimmt der Seperator nicht! Weiß nicht wie ich das verwenden soll.
Aber die Austauschddatei die mir vorliegt hat 145 Zeillen (Excel FO)

Gruß
Benny

marabu 25. Feb 2007 15:41

Re: eBay Turbolister CSV einlesen
 
CSV ist ja nicht gleich CSV.

Welches Trennzeichen verwendest du denn in deiner CSV-Datei?

bennle 25. Feb 2007 15:51

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von marabu
CSV ist ja nicht gleich CSV.

Welches Trennzeichen verwendest du denn in deiner CSV-Datei?

Also ich bzw. TuroLister verwendet das Semikolon";"

Gruß
Benny

PS: Aber wie stelle ich es ein?

marabu 25. Feb 2007 16:13

Re: eBay Turbolister CSV einlesen
 
In der Demo kannst du im Ereignis OnCreate() der Form zwei zusätzliche Zeilen eintragen:

Delphi-Quellcode:
procedure TMainForm.FormCreate(Sender: TObject);
begin
  Application.Title := Caption;
  FFileName := '';
  FNames := TStringList.Create;
  Values := TStringList.Create;
  FFields := TStringList.Create;

  // Trenner umstellen
  FFields.Delimiter := ';';
  FNames.Delimiter := ';';
end;
Danach solltest du die Datei problemlos öffnen können. Allerdings soll dir die Demo nur den Umgang mit einer virtuellen ListView nahe bringen.

Bei eBay wird für mich der Eindruck erweckt, der gewünschte Trenner sei ein Komma:

Zitat:

Wie erstelle ich eine CSV-Datei?

CSV-Dateien können auf verschiedene Weise erstellt werden. Zumeist werden sie mit Hilfe eines Tabellenkalkulationsprogramms wie Microsoft Excel angelegt und dann als CSV gespeichert. (Im Datei "Menü" von Microsoft Excel den Menüpunkt "Speichern unter" auswählen -> dann als Dateiformat CSV (Trennzeichen-Getrennt) wählen und die Datei speichern). Danach müssen Sie die gespeicherte Datei mit einem Editor (z.B. Notepad) aufrufen und das ";"(Semikolon) Trennzeichen durch ein "," (Komma) Trennzeichen ersetzen. Wählen Sie dazu im Editor im Menü "Bearbeiten" die Funktion "Ersetzen". Geben Sie dann im "Suchen nach" Feld ein ";" (Semikolon) und im "Ersetzen Durch" Feld ein "," (Komma) ein und drücken Sie auf die Schaltfläche "Alles Ersetzen".
Seltsam...

Freundliche Grüße

DP-Maintenance 25. Feb 2007 18:16

DP-Maintenance
 
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "VCL / WinForms / Controls" verschoben.
Passt besser hierher.

agm65 26. Feb 2007 09:42

Re: eBay Turbolister CSV einlesen
 
am besten du nimmst den code von mr kinzler, den hab ich auch genommen, damit gehts 1a !

Delphi-Quellcode:
var
   zeilennr: integer;
   DateiName, Zeile: String;
   F: TextFile;

begin

   OpenDialog.Execute;                // Das Ergebnis steht in FileName
//   ShowMessage(OpenDialog1.FileName);
   DateiName := OpenDialog.FileName;  //Der Pfad wird in die Datei gestellt
   txtfilename.Text := DateiName;

   //   ShowMessage(DateiName);
   sl:=TStringList.Create; //Objekt erzeugen
   sl.Delimiter := ';';
   try
      //sl.LoadFromFile(DateiName);      //Datei in Stringliste laden
      AssignFile(F, OpenDialog.FileName);
      Reset(F);
      Readln(F, Zeile); //Erste Zeile laden
      sl.DelimitedText := Zeile; //Zeile der StringListe zuweisen, nun kann man mit der Eigenschaft Count die Anzal der          Spalten auslesen, die Spaltenname sthen dann in der Stringliste

      //sl.Strings[0] enthält Namen erste Spalte usw.

     While not Eof(F) do //Daten laden
      begin
         Readln(F, S);
         Edit1.Text := S;

         sl.DelimitedText := s; // Datenzeile wird in Stringliste geschrieben -< Auslesen wie Kopfspalte

      end;


   finally


      //
      //sl.free; //Objekt wieder freigeben
      edit2.Text := inttostr(sl.count);
end;

mkinzler 26. Feb 2007 09:44

Re: eBay Turbolister CSV einlesen
 
Es dürfen dann halt ekien Lerrzeichen in den Feldern vorkommen, dsa diese dann als Spaltentrenner erkannt werden.

bennle 26. Feb 2007 16:07

Re: eBay Turbolister CSV einlesen
 
Zitat:

Zitat von mkinzler
Es dürfen dann halt ekien Lerrzeichen in den Feldern vorkommen, dsa diese dann als Spaltentrenner erkannt werden.

Das wäre schlecht! Denn im Titel/Beschreibung gibt es natürlich schon leerzeichen.
Wie kann ich abhilfe schaffen?

Ich werde mir jetzt mal noch den Code genauer anschauen.

Vielen Dank.

MfG
Benny

bennle 26. Feb 2007 17:17

Re: eBay Turbolister CSV einlesen
 
Hallo,
So nun also ich bin echt am verzweifeln.
Das was auf der Ebayseite steht stimmt leider nicht! Denn Sie hat mehr als 102 Zellen und verwendet (;) Semikolon als Trennzeichen. Vielleicht stammen die Daten aus der Zeit von Turbolister No. 1

Ok ich habe jetzt mal eine Datei im Anhang!

Ich denke ich gehe da schritt für Schritt ran! Komischerweise kann Excel sie richtig öffen! Es stört nicht mal das obwohl es ein Trennzeichen wäre! Wie macht man das???

Wäre super wenn wir das hinkriegen würden.

Gruß
Benny

[edit=MrSpock]Attachment auf Wunsch des Erstellers gelöscht. Mfg, MrSpock[/edit]

Klaus01 26. Feb 2007 18:15

Re: eBay Turbolister CSV einlesen
 
Warum zerlegst Du nicht die Zeilen mit explode
und schreinst dann das StringArray in ein TStringGrid oder TMemo.

Grüße
Klaus

bennle 26. Feb 2007 18:21

Re: eBay Turbolister CSV einlesen
 
Hi Klaus,
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 und dann gibt es schon Fehler!
Zudem habe ich noch das Problem mit dem HTML Code!!! Denn dieser Beinhaltet manchmal das Trennzeichen!

MfG
Benny

Klaus01 26. Feb 2007 18:27

Re: eBay Turbolister CSV einlesen
 
Du hast aber auch WordWrap des Memo auf false stehen oder?

Grüße
Klaus

bennle 26. Feb 2007 18:31

Re: eBay Turbolister CSV einlesen
 
Mir fällt gerade etwas ein.
Ist es möglich die CSV Datei als Excel-Datei zu öffen (also mit Excel API)
und dann die Zellen auszulesen?
Wäre um einiges einfacher!

Gruß
Benny

IngoD7 26. Feb 2007 19: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 20: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 20: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 20: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 21: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 11: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 11:09 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