AGB  ·  Datenschutz  ·  Impressum  







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

CSV Dateien einlesen

Ein Thema von DelphiRacer · begonnen am 28. Mär 2013 · letzter Beitrag vom 30. Mär 2013
Antwort Antwort
Seite 2 von 2     12   
DelphiRacer

Registriert seit: 28. Nov 2003
Ort: Königsbronn
8 Beiträge
 
Delphi XE3 Professional
 
#11

AW: CSV Dateien einlesen

  Alt 28. Mär 2013, 12:22
Das müsste ich mir mal ganz in Ruhe anschauen. Wenn es schnell gehen soll, ersetze doch testhalber mal alle PChar durch PAnsiChar und alle Char durch AnsiChar. Funktioniert es dann?
Die (Ansi)strings nicht vergessen!

Gruß
K-H
Das habe ich gemacht, leider kommen eine Menge Fehlermeldungen:
(logisch)
fDelimiter := FormatSettings.ListSeparator (AnsiChar, Char)

...der .Listseparator ist ein (Char)
muss doch einiges umgeschrieben werden.
Ziehe mir gerade die Hilfe von E-XE3 heran.


Ein Auszug sagt:

Aufrufe von Read/ReadBuffer-Methoden von TStream
Überprüfen Sie die Aufrufe von TStream.Read/ReadBuffer, wenn Strings oder Zeichen-Arrays verwendet werden. Sehen Sie sich das folgende Beispiel an:

var
S: string;
L: Integer;
Stream: TStream;
Temp: AnsiString;
begin
// Vorhandener Code ist falsch, wenn String UnicodeString ist
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L);

// Richtig für Unicode-String-Daten
Stream.Read(L, SizeOf(Integer));
SetLength(S, L);
Stream.Read(Pointer(S)^, L * SizeOf(Char)); // <<-- Geben Sie die Puffergröße in Byte an

// Richtig für Ansi-String-Daten
Stream.Read(L, SizeOf(Integer));
SetLength(Temp, L); // <<-- Temporären AnsiString verwenden
Stream.Read(Pointer(Temp)^, L * SizeOf(AnsiChar)); // <<-- Geben Sie die Puffergröße in Byte an
S := Temp; // <<-- String auf Unicode erweitern
end;

Role
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

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

AW: CSV Dateien einlesen

  Alt 28. Mär 2013, 12:47
Das habe ich gemacht, leider kommen eine Menge Fehlermeldungen:
(logisch)
fDelimiter := FormatSettings.ListSeparator (AnsiChar, Char)

...der .Listseparator ist ein (Char)
muss doch einiges umgeschrieben werden.
Ziehe mir gerade die Hilfe von E-XE3 heran.


Ein Auszug sagt:

[COLOR="Blue"] Aufrufe von Read/ReadBuffer-Methoden von TStream
Überprüfen Sie die Aufrufe von TStream.Read/ReadBuffer, wenn Strings oder Zeichen-Arrays verwendet werden. Sehen Sie sich das folgende Beispiel an:................
Hab ich da irgendetwas verpasst?
Der Listseperator ist ein Char was soll dann das "(Ansichar, Char)"?

Irgendwann später wirst Du auch die Daten einlesen, da muß der Puffer entsprechend angepasst werden (sizeof(char) ) soweit ganz richtig, aber was haben diese beiden sachen miteinander zu tun?

Und was ist wenn Du CSV-Dateien mit 16 und 8 Bit-Zeichen hast?

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

Registriert seit: 28. Nov 2003
Ort: Königsbronn
8 Beiträge
 
Delphi XE3 Professional
 
#13

AW: CSV Dateien einlesen

  Alt 28. Mär 2013, 13:40
Das habe ich gemacht, leider kommen eine Menge Fehlermeldungen:
(logisch)
fDelimiter := FormatSettings.ListSeparator (AnsiChar, Char)

...der .Listseparator ist ein (Char)
muss doch einiges umgeschrieben werden.
Ziehe mir gerade die Hilfe von E-XE3 heran.


Ein Auszug sagt:

[COLOR="Blue"] Aufrufe von Read/ReadBuffer-Methoden von TStream
Überprüfen Sie die Aufrufe von TStream.Read/ReadBuffer, wenn Strings oder Zeichen-Arrays verwendet werden. Sehen Sie sich das folgende Beispiel an:................
Hab ich da irgendetwas verpasst?
Der Listseperator ist ein Char was soll dann das "(Ansichar, Char)"?

Irgendwann später wirst Du auch die Daten einlesen, da muß der Puffer entsprechend angepasst werden (sizeof(char) ) soweit ganz richtig, aber was haben diese beiden sachen miteinander zu tun?

Und was ist wenn Du CSV-Dateien mit 16 und 8 Bit-Zeichen hast?

Gruß
K-H
Das diente nur zur Darstellung,
das der fDelimiter=AnsiChar, und Listseperator=Char ist.
(Darstellung war verwirrend, einfach vergessen)...

Da ein einfaches Umschreiben in diesem Falle nicht möglich ist...
Role
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.624 Beiträge
 
Delphi 12 Athens
 
#14

AW: CSV Dateien einlesen

  Alt 28. Mär 2013, 13:43
Aber ein Cast sollte doch funktionieren:
Delphi-Quellcode:
var
  c: Ansichar;
  d: char;
begin
  c := 'A';
  d := Char(c);
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
DelphiRacer

Registriert seit: 28. Nov 2003
Ort: Königsbronn
8 Beiträge
 
Delphi XE3 Professional
 
#15

AW: CSV Dateien einlesen

  Alt 30. Mär 2013, 10:24
Aber ein Cast sollte doch funktionieren:
Delphi-Quellcode:
var
  c: Ansichar;
  d: char;
begin
  c := 'A';
  d := Char(c);
Das schon...
dafür eine Menge andere Fehler.

Es musste eine schnelle Lösung her.
Habe das Ganze jetzt so gelöst...
Liest "nur" die selbst gebastelten CSV-File.
Also "Text";daten;"Text";Text;Daten

Delphi-Quellcode:

uses
  function Read_CSV(SG: TStringGrid; Dateiname: String): Boolean;

.
.
procedure T_Zutaten.FormShow(Sender: TObject);
var t: string;

begin
  t:='C:\DB\Zutaten.csv';
  Read_CSV (StringGrid1,t);
end.
.
.
// CSV File Einlesen ===========================================================
function Read_CSV (SG: TStringGrid; Dateiname: String): Boolean;
var
 OutputFile: TextFile;
sOutputName: string;
          l: integer;
          c: integer;
        x,y: integer;
        s,t: string;

begin
  // Startwerte Reihe StringGrid
  y:=-1;

  sOutputname:=Dateiname;
  AssignFile(OutputFile, sOutputName);
  Reset(OutputFile);
  try
    while not Eoln(outputFile) do
    begin
      x:=0;
      y:=y+1;
      SG.RowCount:=y+1;
      ReadLn(OutputFile, t);
      l:=length(t);
      s:='';
      for c := 1 to l do
        begin
          if t[c]<> ';then if t[c]<> '"then s:=s+t[c];
          // Trennzeichen gefunden
          if t[c] = ';then
          begin
            if length(s)=0 then s:=' ';
            SG.Cells[x,y]:=s;
            s:='';
            x:=x+1;
            if y=0 then SG.ColCount:=x;
          end;
          // Zeilen Ende
          if c = l then
          begin
            if length(s)=0 then s:=' ';
            SG.Cells[x,y]:=s;
            s:='';
            x:=x+1;
            if y=0 then SG.ColCount:=x;
          end;
        end;
    end;
  finally
    CloseFile(OutputFile);
    Result:=True;
  end;
end;
Role
  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 10:43 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