Dynamisches Array oder StringGrid

Für Fragen von Einsteigern und Programmieranfängern...
Benutzeravatar
stoffel_hessen
Beiträge: 60
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Dynamisches Array oder StringGrid

Beitrag von stoffel_hessen »

Hallo Gemeinde,

ich habe mal eine Frage, in einem Programm verwende ich einige StringGrid Tabellen zum zwischenspeichern von Informationen, welche in Semikolon separierten Dateien vorliegen. Dies Dateien werden nur eingelesen und im Programm nicht verändert, auch werden die Daten nicht dargestellt. Es befinden sich pro Zeile zwischen 2 und 6 Werten, in einer Tabelle variiert die Länge aber nicht.
Ist es hier nun sinnvoller StringGrid Tabellen zu verwenden oder dynamische Arrays.

Danke für eure Meinungen und Unterstützungen.

Gruß Christopher
Gruß Christopher

Benutzeravatar
h-elsner
Beiträge: 191
Registriert: Di 24. Jul 2012, 15:42
OS, Lazarus, FPC: LINUX Mint18.3, Win10, Lazarus 2.0.12, FPC3.2.0
CPU-Target: 64Bit
Wohnort: Illertissen
Kontaktdaten:

Re: Dynamisches Array oder StringGrid

Beitrag von h-elsner »

Ich persönlich würde eine TStringList benutzen. Mann kann leicht auf die einzelnen Werte zugreifen: Zeilen über den Index in der Liste 0..Count-1 und die Spalten über die Position im String:
Beispiel: Substring s, Zeile i, Spalte k

Code: Alles auswählen

s:=aStringList[i].Split([';'])[k];
Ist nur mein Geschmack, weil die StringListe eine Menge schöner Sachen mitbringt, wie z.B: aStringList.LoadFromFile, aber ob es die elegenteste Lösung ist, weiß ich nicht.

Gruß HE
Zuletzt geändert von m.fuchs am Mo 27. Jun 2022, 23:15, insgesamt 1-mal geändert.

Benutzeravatar
Winni
Beiträge: 1316
Registriert: Mo 2. Mär 2009, 16:45
OS, Lazarus, FPC: Laz2.2.2, fpc 3.2.2
CPU-Target: 64Bit
Wohnort: Fast Dänemark

Re: Dynamisches Array oder StringGrid

Beitrag von Winni »

Hi!

StringGrid ist schon das richtige Werkzeug.

Bringt so komfortable Proceduren wie

Code: Alles auswählen

 StringGrid.LoadFromCSVFile
sowie den problemlosen Zugriff auf die Zelle X/Y die hier Col/Row genannt werden.

Winni

wp_xyz
Beiträge: 4314
Registriert: Fr 8. Apr 2011, 09:01

Re: Dynamisches Array oder StringGrid

Beitrag von wp_xyz »

h-elsner, wunderst du dich warum der Text in deinem Beitrag plötzlich kursiv wird? Schaue dir den Rohtext nochmals genau an, und du wirst sehen, dass das genau da passiert, wo in deinem Text die StringList am Index i ausgelesen wird: aStringlist[ i]. Das i in eckigen Klammern ist aber der Startcode für kursive Schrift. Um das zu vermeiden, füge nach der öffnenden Klammer ein Leerzeichen ein, oder besser, weil das Code-fragment schon in einer eigenen Zeile steht, schließe den Code mit [ code]...[/ code] Tags ein:

Code: Alles auswählen

s:=aStringList[i].Split([';'])[k];

Benutzeravatar
theo
Beiträge: 9163
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamisches Array oder StringGrid

Beitrag von theo »

Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.

Code: Alles auswählen

uses csvdocument;

var CSVDoc:TCSVDocument;
begin
  CSVDoc:=TCSVDocument.Create;
  CSVDoc.Delimiter:=';';
  CSVDoc.LoadFromFile('/home/theo/test.csv');
  ShowMessage(CSVDoc.Cells[2,2]);     
  CSVDoc.Free;
end; 

wp_xyz
Beiträge: 4314
Registriert: Fr 8. Apr 2011, 09:01

Re: Dynamisches Array oder StringGrid

Beitrag von wp_xyz »

theo hat geschrieben:
Di 28. Jun 2022, 09:56
Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.
Absolut! Aber auch TCSVDocument wäre mir zuviel Aufwand und Overhead, solange die Datei keine problematischen Fälle wie Zeilenumbruch oder Anführungs- oder Spaltentrennzeichen im Zell-Text o.ä. enthält. Für Quick-and-dirty reichen ein paar Zeilen mit TStringList. Ungetestet:

Code: Alles auswählen

type
  TDoubleArray2D = array of array of Double;
  
procedure ReadCSV(AFileName: String; out AData: TDoubleArray2D);
const
  SPALTEN_TRENNER = ';';   // Spalten-Trenner soll der Strichpunkt sein. Ggfs. anpassen.
var
  L: TStringList;
  i, j: Integer;
  sa: TStringArray;
begin
  L := TStringList.Create;   
  try
    L.LoadFromFile(AFileName);
    // Ich nehme an, in der 1.Zeilen stehen die Spaltenüberschriften, und das definiert die Zahl der Spalten
    sa := L[0].Split(SPALTEN_TRENNER);
    SetLength(data, L.Count, Length(sa));
    for i := 1 to L.Count-1 do   // i beginnt mit 1, denn die Spaltenüberschriften sollen nicht ins data-Array.
    begin
      sa := L[i].Split(SPALTEN_TRENNER);
      for j := 0 to Length(sa)-1 do
        data[i,j] := StrToFloatDef(sa[j], 999.999);
    end;
  finally
    L.Free;
  end;
end;

Benutzeravatar
theo
Beiträge: 9163
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamisches Array oder StringGrid

Beitrag von theo »

wp_xyz hat geschrieben:
Di 28. Jun 2022, 13:35
Absolut! Aber auch TCSVDocument wäre mir zuviel Aufwand und Overhead, solange die Datei keine problematischen Fälle wie Zeilenumbruch oder Anführungs- oder Spaltentrennzeichen im Zell-Text o.ä. enthält. Für Quick-and-dirty reichen ein paar Zeilen mit TStringList. Ungetestet:
Das sehe ich nicht so. TCSVDocument ist eine saubere Lösung ohne wenn-und-aber, mit einem sehr vertretbaren Overhead.
Was dabei der "Aufwand" sein soll, erschliesst sich mir nicht. Einfacher geht's doch nicht?
Man muss heute auf einem PC ja nun wirklich nicht jedes Byte mehr einzeln zählen, sonst kommt man nirgends hin.
Auf gewissen Microcontrollern mag das noch sein.

Benutzeravatar
stoffel_hessen
Beiträge: 60
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Dynamisches Array oder StringGrid

Beitrag von stoffel_hessen »

Winni hat geschrieben:
Mo 27. Jun 2022, 22:48

StringGrid ist schon das richtige Werkzeug.

Bringt so komfortable Proceduren wie

Code: Alles auswählen

 StringGrid.LoadFromCSVFile
Danke für deinen Beitrag, ich verwende StringGrid schon einige Jahre, wusste aber nicht das es diese Procedere gibt, hab diese immer selbst geschrieben.
Gruß Christopher

Benutzeravatar
stoffel_hessen
Beiträge: 60
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Dynamisches Array oder StringGrid

Beitrag von stoffel_hessen »

theo hat geschrieben:
Di 28. Jun 2022, 09:56
Vielleicht bin ich altmodisch, aber ich würde nie eine visuelle Komponente für Non-Gui Aufgaben missbrauchen.
Ich empfehle TCSVDocument.
Auch dir ein Dankeschön, dies kannte ich überhaupt nicht, ist auch eine Alternative
Gruß Christopher

Benutzeravatar
theo
Beiträge: 9163
Registriert: Mo 11. Sep 2006, 19:01

Re: Dynamisches Array oder StringGrid

Beitrag von theo »

stoffel_hessen hat geschrieben:
Di 28. Jun 2022, 20:20
Auch dir ein Dankeschön, dies kannte ich überhaupt nicht, ist auch eine Alternative
Bei CSV führen viele Wege nach Rom.
Man kann es auch ganz "modern" machen: :wink:

Code: Alles auswählen

unit Unit1;

{$mode objfpc}{$H+}
{$modeswitch nestedprocvars}

interface

uses
  Classes, SysUtils, Forms, Controls, Graphics, Dialogs, StdCtrls, lcsvutils, fgl;

type

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private

  public

  end;

  TCSVList = specialize TFPGObjectList<TStringList>;

var
  Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }

procedure TForm1.Button1Click(Sender: TObject);
var CSVList: TCSVList;

  procedure CSVLineProc(Fields: TStringList);
  var SL: TStringList;
  begin
    SL := TStringList.Create;
    SL.Assign(Fields);
    CSVList.Add(SL);
  end;

begin
  CSVList := TCSVList.Create;
  LoadFromCSVFile('/home/theo/test.csv', @CSVLineProc, ';');
  ShowMessage(CSVList[1][0]);
  CSVList.Free;
end;

end.
Wenn man auf den vorhandenen Code zurückgreift, auch mit TCSVDocument, werden auch "merkwürdige" CSV Dateien korrekt gelesen.
Z.B Delimiter oder Zeilenumbrüche innerhalb von Anführungszeichen.

Bsp.
1eins;zwei;drei;vier
"2e
ins";"zw;ei";drei;vier
3eins;zwei;drei;vier
4eins;zwei;drei;vier

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Dynamisches Array oder StringGrid

Beitrag von BoraBora »

Hallo Theo,

benutze bisher auch TStringgrid und würde lieber mit Non-Gui-Elementen arbeiten,
daher blöde Frage: wo finde ich denn TCSVDocument?

Schon mal Danke an dieser Stelle.

BB

Benutzeravatar
stoffel_hessen
Beiträge: 60
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Dynamisches Array oder StringGrid

Beitrag von stoffel_hessen »

BoraBora hat geschrieben:
Mi 29. Jun 2022, 08:34
wo finde ich denn TCSVDocument?
Hallo,

wie Theo oben 28. Jun 2022, 09:56 schon geschrieben hatte

Code: Alles auswählen

uses csvdocument;
oder habe ich deine Frage nicht verstanden?
Gruß Christopher

Benutzeravatar
af0815
Lazarusforum e. V.
Beiträge: 5177
Registriert: So 7. Jan 2007, 10:20
OS, Lazarus, FPC: FPC fixes Lazarus fixes per fpcupdeluxe (win,linux,raspi)
CPU-Target: 32Bit (64Bit)
Wohnort: Niederösterreich
Kontaktdaten:

Re: Dynamisches Array oder StringGrid

Beitrag von af0815 »

BoraBora hat geschrieben:
Mi 29. Jun 2022, 08:34
daher blöde Frage: wo finde ich denn TCSVDocument?
Die Frage ist nicht blöd. So wie stoffel_hessen schieb, einfach in uses aufnehmen.

Der Grund, das Paket ist im fpc enthalten und zwar unter fpcsrc/packages/fcl-base/src/csvdocument.pas .

Der Artikel in der Wiki https://wiki.freepascal.org/CsvDocument dürfte nicht mehr ganz taufrisch sein, da dort als Ort noch das Lazarus-CCR angegeben ist und noch nicht, das es auch im fpc enthalten ist.
Blöd kann man ruhig sein, nur zu Helfen muss man sich wissen (oder nachsehen in LazInfos/LazSnippets).

Benutzeravatar
BoraBora
Beiträge: 29
Registriert: So 11. Apr 2021, 16:00
OS, Lazarus, FPC: Linux Mint, Win 10, Android
CPU-Target: xxBit

Re: Dynamisches Array oder StringGrid

Beitrag von BoraBora »

Vielen Dank af0815,

in der Zwischenzeit habe ich dann auch bemerkt, dass TCSVDocument in einem Package steckt...
Funktioniert jetzt.

BB

Benutzeravatar
stoffel_hessen
Beiträge: 60
Registriert: Sa 18. Jun 2022, 12:27
OS, Lazarus, FPC: Windows 11 (Version 2.2.2, FPC 3.2.2)
CPU-Target: x86 64Bit
Wohnort: Riedstadt

Re: Dynamisches Array oder StringGrid

Beitrag von stoffel_hessen »

Ich bin nun noch über ein kleines Problem mit StringGrid gestolpert, wie kann ich zwei csv-Dateien mit StringGrid.LoadFromCSVFile in die gleiche Tabelle laden, so das die Daten beider csv-Dateien zeitgleich im StringGrid stehen.
Das einfache laden der zweiten Datei überschreibt den Inhalt der ersten.
Gruß Christopher

Antworten