![]() |
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:
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.
Firma;Channel;MAC
A;1;x A;2;x A;3;x A;4;x A;5;x B;6;x B;7;x Habe hier im Forum folgende unit gefunden: ![]() Die ist prinzipiell super, aabbbeerrr wenn ich folgenden code verwende:
Delphi-Quellcode:
bekomme ich folgendes Ergebnis:
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.
Code:
Wie könnte ich das Firmenbezogen machen bzw. hat jemand ein Beispiel wie das funktionieren könnte?
Firma
Channel MAC A 1 X A 2 X A 3 X A 4 X A 5 X B 6 X B 7 X Danke im Voraus LG |
AW: csv read
Du müsstest csvReader.Columns[0] auf die richtige Firma prüfen.
|
AW: csv read
das bedeutet für mich was? :wiejetzt:
|
AW: csv read
Eine Abfrage einzubauen?
Delphi-Quellcode:
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).
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. |
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 :( |
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 |
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. |
AW: csv read
Warum so kompliziert, wenn es doch so schön einfach geht:
Delphi-Quellcode:
Es wird in dem Verzeichnis mit den Daten aber auch noch die Datei
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; ![]() In deinem Fall sollte folgender Inhalt genügen
Code:
Man könnte alternativ die Daten auch mit TADOTable auslesen und dann einen Filter setzen
[config.csv]
Format=Delimited(;) |
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 |
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. |
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