Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   csv read (https://www.delphipraxis.net/154873-csv-read.html)

value is NULL 29. Sep 2010 09:03

csv read
 
Hi Delphianer, habe eine neue herausforderung (für mich zumindest ) da ich mit csv noch nie zu tun hatte :)

mein csv file sieht wie folgt aus:

Code:
Firma;Channel;MAC
A;1;x
A;2;x
A;3;x
A;4;x
A;5;x
B;6;x
B;7;x
Meine Aufgabe besteht darin, Alle Einträge für Firma A (in diesem Fall Channel 1-4 und Mac x - x) in ein xml zu schreiben. Jedoch scheitere ich schon am auslesen.
Habe hier im Forum folgende unit gefunden:

http://www.delphipraxis.net/110025-c...v-dateien.html

Die ist prinzipiell super, aabbbeerrr wenn ich folgenden code verwende:

Delphi-Quellcode:
var
  csvreader : TCsvReader;
  sData : TFilestream;
  i : integer;

begin
  sData := TFilestream.Create('M:\modules Delphi\CSVreader\config.csv',fmopenread);
  csvReader := TCSVReader.Create (sData, ';');
  csvReader.First;
  try
    while not csvreader.Eof do begin
      for i:=0 to csvreader.columncount -1 do
        Writeln(csvreader.Columns[i]);
      csvreader.Next;
    end;
  finally
    csvreader.Free;
    sdata.Free;
  end;
end.
bekomme ich folgendes Ergebnis:

Code:
Firma
Channel
MAC
A
1
X
A
2
X
A
3
X
A
4
X
A
5
X
B
6
X
B
7
X
Wie könnte ich das Firmenbezogen machen bzw. hat jemand ein Beispiel wie das funktionieren könnte?

Danke im Voraus

LG

DeddyH 29. Sep 2010 09:16

AW: csv read
 
Du müsstest csvReader.Columns[0] auf die richtige Firma prüfen.

value is NULL 29. Sep 2010 09:36

AW: csv read
 
das bedeutet für mich was? :wiejetzt:

DeddyH 29. Sep 2010 09:44

AW: csv read
 
Eine Abfrage einzubauen?
Delphi-Quellcode:
var
  csvreader : TCsvReader;
  sData : TFilestream;
  i : integer;

begin
  sData := TFilestream.Create('M:\modules Delphi\CSVreader\config.csv',fmopenread);
  csvReader := TCSVReader.Create (sData, ';');
  csvReader.First;
  try
    while not csvreader.Eof do begin
      //nur Firma 'A'
      if csvreader.Columns[0] = 'A' then
        for i:=0 to csvreader.columncount -1 do
          Writeln(csvreader.Columns[i]);
      csvreader.Next;
    end;
  finally
    csvreader.Free;
    sdata.Free;
  end;
end.
Vorher würde ich aber noch sicherstellen, dass auch Columns vorhanden sind, aber ich war zu faul, mir die Klasse jetzt anzuschauen (vermutlich geht Columns.Count).

value is NULL 29. Sep 2010 11:42

AW: csv read
 
ok das funkt gut, bekomme jetzt praktisch alle spalten welche mit Firma A zu tun haben.

Aber wie funktioniert das dann, wenn ich zB sagen möchte:

*) Alle zeilen für Firma a auslesen
*) Alle Channels und MAC Adressen, welche gefunden wurden in ein Textfile schreiben: Channel 1 = MAC X

weiß leider nicht wie ich das anstellen soll :(

hoika 29. Sep 2010 11:45

AW: csv read
 
Hallo,

ich würde eine TStringList nehmen (Stichwort Delimiter und DelimitedText),
Damit werden die Daten einer Zeile gelesen.
Wie du die dann weiterverarbeitest, ist deine Sache (ich würde eine Klasse + TList nehmen).


Heiko

DeddyH 29. Sep 2010 11:56

AW: csv read
 
Delphi-Quellcode:
var
  csvreader : TCsvReader;
  sData : TFilestream;
  sList: TStringList;
  i : integer;

begin
  sData := TFilestream.Create('M:\modules Delphi\CSVreader\config.csv',fmopenread);
  try
    csvReader := TCSVReader.Create (sData, ';');
    try
      sList := TStringList.Create;
      try
        csvReader.First;
        while not csvreader.Eof do begin
          //nur Firma 'A'
          if csvreader.Columns[0] = 'A' then
            sList.Add(Format('Channel %s = MAC %s',[csvreader.Columns[1],csvreader.Columns[2]));
          csvreader.Next;
        end;
        sList.SaveToFile(<Dateiname>); //hier Dateinamen eintragen
      finally
        sList.Free;
      end;
    finally
      csvreader.Free;
    end;
  finally
    sdata.Free;
  end;
end.

Sir Rufo 29. Sep 2010 12:20

AW: csv read
 
Warum so kompliziert, wenn es doch so schön einfach geht:
Delphi-Quellcode:
  var
    con : TADOConnection;
    qry : TADOQuery;
    MyFile : string;
  begin
    MyFile := 'M:\modules Delphi\CSVreader\config.csv';
    con := TADOConnection.Create( nil );
    try
      con.ConnectionString := 'Driver={Microsoft Text-Treiber (*.txt; *.csv)};Extensions=asc,csv,tab,txt;';
      con.LoginPrompt := False;
      con.DefaultDatabase := ExtractFileDir( MyFile );
      con.Open;
      try
        qry := TADOQuery.Create( con );
        qry.Connection := con;
        qry.SQL.Text := Format( 'SELECT * FROM %s WHERE Firma = %s', [ ExtractFileName( MyFile ), QuotedStr( 'A' ) ] );
        qry.Open;
        try
          while not qry.Eof do
            begin
              // Verarbeitung der Daten z.B. mit qry.FieldByName( 'Firma' ).AsString
              qry.Next;
            end;
        finally
          qry.Close;
        end;
      finally
        con.Close;
      end;
    finally
      con.Free;
    end;
  end;
Es wird in dem Verzeichnis mit den Daten aber auch noch die Datei schema.ini benötigt
In deinem Fall sollte folgender Inhalt genügen
Code:
[config.csv]
Format=Delimited(;)
Man könnte alternativ die Daten auch mit TADOTable auslesen und dann einen Filter setzen

Tossi65 29. Sep 2010 12:39

AW: csv read
 
@Sir Rufo
Das ist ja geil!! Man lernt nie aus. Muss man bei dieser Methode auf
irgendeine MSDac Version achten oder ist es Basisbestandteil von ADO??

Danke Torsten

Sir Rufo 29. Sep 2010 12:42

AW: csv read
 
Das ist eine gute Frage ... ich halte es da wie die Hummel ... ich mach es einfach und es klappt ;)

Bisher hatte ich bei keiner Windows-Version damit Probleme (selbst nackig installierte Systeme)


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:34 Uhr.
Seite 1 von 2  1 2      

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