AGB  ·  Datenschutz  ·  Impressum  







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

CSV-Datei in Stringgrid bringen

Ein Thema von peschai · begonnen am 4. Jun 2009 · letzter Beitrag vom 11. Nov 2009
 
alzaimar
(Moderator)

Registriert seit: 6. Mai 2005
Ort: Berlin
4.956 Beiträge
 
Delphi 2007 Enterprise
 
#8

Re: CSV-Datei in Stringgrid bringen

  Alt 27. Okt 2009, 07:25
Zitat von peschai:
Der Trick ist, ...
sich Post #2 zu Herzen zu nehmen, kurz drüberschauen und einfach auskodieren;
Delphi-Quellcode:
Uses csCSV, Math; // Math nur wegen 'Max'
var
  csvReader: TCSVReader;
  data: TStringStream;
  sl: TStringList;
  i, r: Integer;

begin
  StringGrid1.RowCount := 1;
  StringGrid1.ColCount := 1;
  sl := TStringlist.Create; // Für das Beispiel
  try
// Füllen mit Test-CSV
    sl.Add('SpalteA;SpalteB;"SpalteC";"SpalteD"');
    sl.Add('1A;1B;1C;1D');
    sl.Add('"2A";2B;"2C";"2D"');
    sl.Add(';;;');
    sl.Add('4A;"4BMitUmbruch');
    sl.Add('4BVonNeuerZeile";"4CMitSeparatorUndQuote;""";4D');
    sl.Add('5A;5B;5C;"5DMitUmbruchInLetzerSpalte');
    sl.Add('5DVonNächsterZeile"');
    sl.Add('6A;6B;6C;6D');
    data := TStringStream.Create(sl.Text); // der TCSVReader erwartet einen InputStream
    csvReader := TCSVReader.Create(data);
    try
      csvReader.Delimiter := ';';
      csvReader.Quote := '"';
      csvReader.EOLChar := #13; // In unserer 'Datei' werden die Zeilen durch #13#10 getrennt
      csvReader.EOLLength := 2; // #13 trennt also, aber die EOL-Länge ist 2
      csvReader.First;
      while not csvReader.Eof do begin
// Die CSV-Zeilen können unterschiedlich viele Spalten beinhalten
        StringGrid1.ColCount := Max(stringGrid1.ColCount, csvReader.ColumnCount + 1);
// Eine Hilfsvariable (nicht Refactoring-konform, aber etwas lesbarer)
        r := StringGrid1.RowCount - 1;
// Spaltenbezeichnung '1','2' usw. gilt aber nicht für die Überschrift
        if r > 0 then
          StringGrid1.Cells[0, r] := IntToStr(r);
// Einlesen der Spalten
        for I := 0 to csvReader.ColumnCount - 1 do
          StringGrid1.Cells[i + 1, r] := csvReader.Columns[i];
// Nächste CSV-Zeile einlesen
        csvReader.Next;
// Nur, wenn wir noch nocht am Ende sind, eine Zeile hinzuzählen
        if not csvReader.Eof then
          StringGrid1.RowCount := StringGrid1.RowCount + 1;
      end;
// Zum Schluss wieder eine Zeile abziehen (komisches Verhalten des StringGrid)
      StringGrid1.RowCount := StringGrid1.RowCount - 1;
    finally
      csvReader.Free;
      data.Free;
    end;
  finally
    sl.free;
  end;
end;
"Wenn ist das Nunstruck git und Slotermeyer? Ja! Beiherhund das Oder die Flipperwaldt gersput!"
(Monty Python "Joke Warefare")
  Mit Zitat antworten Zitat
 


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 20:29 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