StringGrid AutoAdjustColumns Probleme

Für Fehler in Lazarus, um diese von anderen verifizieren zu lassen.
Antworten
sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Die in Stringgrid enthaltene procedure AutoAdjustColumns verhält sich meiner Meinung etwas komisch.

Ich wollte ein csv einlesen und dann sollte die Spaltenbreite automatisch angepasst werden.
Hierbei wir aber die Spalte "Name" zu breit bemacht. Im csv ist nicht zu erkennen was das bewirken könnte.

Anbei das Project dazu inkl. csv Datei um die es geht.
Dateianhänge
GMA.zip
(580.49 KiB) 185-mal heruntergeladen
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Ich habe den Fehler gefunden. Die LoadFromCSVFile Procedure hat ein Problem mit der Zeile 701 im CSV.

Code: Alles auswählen

DA/AV-374,"Oberfeld  "Edwinshoehe"",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,

Und zwar damit ("Oberfeld "Edwinshoehe"") kommt es nicht zurecht.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Oder gibt es noch eine andere Möglichkeit das CSV einzulesen, verarbeiten und dann ins Stringgrid?

StringList oder Zeile für Zeile einlesen?
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Hi!

Nö - da ist ein Eintrag der zu dem merkwürdigen Verhalten führt:

Code: Alles auswählen

DA/AV-374   "Oberfeld  ""Edwinshoehe"",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,
DA/AV-375,""Steinelberg"   434   12.04655000   48.83503000   JN68AU   20161011   21991231   0   0   


Das ist EINE Zeile!

Garbage in - garbage out!

Winni

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Hi!

Nu hab ich mit die CSV-Daten im Editor angesehen.

In der Zeile

DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,......

hast Du eine ungerade Anzahl von doppelten Anführungszeichen.

Ich vermute stark, dass die zwei doppelten Anführungszeichen der Fehler sind. Eins löschen!

Winni

PS.: Jo - das wars!!!!
Zuletzt geändert von Winni am Do 9. Apr 2020, 20:19, insgesamt 1-mal geändert.

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Danke Winni, ich werde das mal an den melden der das "Garbage in" macht.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Winni hat geschrieben:DA/AV-374 "Oberfeld ""Edwinshoehe"",487,12.13750000,48.27850000,......

hast Du eine ungerade Anzahl von doppelten Anführungszeichen.


Ja habe ich schon, löst aber in Zukunft nicht das Problem, wie gesagt ich melde das dem Ersteller der CSV Datei.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Sauerstoffmangel auf den Bergspitzen? ....

Ein anderer Vorschlag, falls das eine Excel-Datei ist:

Die kann fpc auch lesen!

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Nein das ist keine Excel Datei die CSV wird, vermute ich, aus einer MySQL Datenbank heraus generiert. Und dann den Mitgliedern auf der Seite zum Download angeboten.

LG Maik und schöne Ostern.
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Hi!

Ich hab noch mal ein bischen losgehackt, um die CSV-Fehler loszuwerden.

edtCSVFileChange hab ich neu geschrieben und eine kleine Hilfsfunktion dazugebaut.

Es gibt ja für strings den DelimetedText, der eine String am Delimeter in Unterstrings "zersägt".

Das wurde genutzt:

Code: Alles auswählen

function convert (stl : TStringList) : TStringArray;
var i : integer;
begin
setlength(Result,stl.count);
for i := 0 to stl.count - 1 do Result[i] := stl[i];
end;
 
procedure TForm1.edtCSVFileChange(Sender: TObject);
var st,fields  : TStringList;
    i : integer;
    A: TStringArray;
begin
  sg.FixedCols:= 0;
  sg.FixedRows:=0;
  sg.BeginUpdate;
  st := TStringList.Create;
  st.loadFromFile (edtCSVFile.FileName);
  Fields:= TStringList.create;
  Fields.Delimiter:=',';
  Fields.SkipLastLineBreak;
  Fields.StrictDelimiter:= true;
  for i := 0 to st.Count - 1 do
    begin
    Fields.DelimitedText:= st[i];
    A := Convert(Fields);
    sg.InsertRowWithValues(i,A);
    Fields.clear;
    end; // i
  st .free;
  Fields.free;
 
  sg.EndUpdate();
  sg.AutoAdjustColumns;
  sg.FixedCols:= 1;
  sg.FixedRows:=1;
end;
 


Der gesamte CSV file wird in eine stringlist namens st geladen.
Die wird zeilenweise abgeklappert.

Jede Zeile wird in die stringlist fields zerlegt.
Dabei gibt der Parameter SkipLastLineBreak an, dass kein weiteres Feld mehr kommt , auch wenn das letzte Zeichen der Delimeter ist.
Der Fehler wird gerne genommen - so auch in Deiner Datei.

Weil StringGrid.InsertRowWithValues ein Array Of String und keine Stringlist braucht, muss das erst umgeformt werden in der function convert.

Wenn ich die FixedRows und FixedCols nicht erstmal auf Null stelle jammert er irgendwann nach einem crash rum, dass er keine 5000 und ein paar FixedRows abkann. ??????

Bunte Eier und schöne Tage
Winni

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

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von wp_xyz »

Es ist wie in Pascal: Ein String wird mit (einfachen) Anführungszeichen begrenzt. Wenn in dem String selbst ein Anührungszeichen vorkommt, dann muss man dieses doppelt nehmen. Genauso ist es hier: Wenn am Ende des problematischen Gipfels DREI (hier doppelte) Anführungszeichen stehen, dann wird alles richtig erkannt.

DA/AV-374,"Oberfeld ""Edwinshoehe""",487,12.13750000,48.27850000,JN68BG,20161007,21991231,0,2,DL1DXA/P,21/06/2017,

Deine Kunden müssten also darauf achten, standard-konforme CSV-Dateien herzustellen. Oder du musst selbst dafür Sorge tragen, dass der Fehler erkannt wird. Wenn die Dateien nicht riesig sind, reicht es wahrscheinlich, die Datei in eine StringList einzulesen, diese Zeile für Zeile zu durchlaufen und dabei nach doppelten Anführungszeichen zu durchsuchen, mit CommaText in die Bestandteile aufzutrennen und den Rows des Stringgrid zuzuweisen:

Code: Alles auswählen

procedure TForm1.edtCSVFileChange(Sender: TObject);
var
  L: TStrings;
  i: Integer;
  p: Integer;
  s: String;
begin
  sg.BeginUpdate;
  L := TStringList.Create;
  try
    L.StrictDelimiter := true;
    L.LoadFromFile(edtCSVFile.FileName);
    sg.RowCount := L.Count+1;
    for i := 0 to L.Count-1 do
    begin
      p := pos('""', L[i]);
      if p > 0 then
      begin
        p := posEx('""', L[i], p+1);
        if p > 0 then begin
          s := Copy(L[i], 1, p) + copy(L[i], p, MaxInt);
          sg.Rows[i].CommaText := s;
          continue;
        end;
      end;
      sg.Rows[i].CommaText := L[i];
    end;
  finally
    L.Free;
    sg.EndUpdate();
  end;
 
  sg.AutoAdjustColumns;
end;

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Hi!

Eben dafür war meine Lösung gedacht.

Die kümmert sich nicht um eine falsche Anzahl von Anführungszeichen.
So wird die ganze Sache robuster.

Du glaubst garnicht, was ich schon alles an verhunzten CSV Dateien gesehen habe, die von Halbwissenden aus Excel oder sonstwo erstellt worden sind.
Da muss man die Einlese-Routine schon unempfindlich machen.

Winni

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

wp_xyz hat geschrieben:Deine Kunden müssten also darauf achten, standard-konforme CSV-Dateien herzustellen.

Hi wp,

Nix Kunden, das ist alles Hobby. Hier verdient und bekommt keiner Geld, nur die Hand auf die Schulter (ala gut gemacht).
Und vielleicht ein Stück Papier mit 1., ... Platz des Jahres 2020..., mehr nicht.

Ich konnte mir nur erst keinen Reim drauf machen.

Primär will ich dieses CSV in eine Sqlite DB einlesen, mit den Stringgrid wollte ich Testen ob das mit dem UTF/Unicode geschichten funktioniert.

Aber vielen lieben Dank an euch beide und schöne Ostern, Maik.

Bei Interesse hier mal schauen: https://www.cqgma.org/
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

sstvmaster
Beiträge: 575
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: StringGrid AutoAdjustColumns Probleme

Beitrag von sstvmaster »

Winni hat geschrieben:...
Eben dafür war meine Lösung gedacht.

Die kümmert sich nicht um eine falsche Anzahl von Anführungszeichen.
So wird die ganze Sache robuster.
...


Danke Winni, funktioniert wunderbar!

Schöne Ostern
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
Winni
Beiträge: 1577
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: StringGrid AutoAdjustColumns Probleme

Beitrag von Winni »

Amateurfunk - damit kenne ich mich überhaupt nicht aus.
Aber ich bin mal darüber gestolpert, als ich über Linux-Kernel-
Parameter gelesen habe: Internet über Amateurfunk.
Da haben Leute aus Südafrika und Kentucky zusammen das
Modul entwickelt - TCP/IP über Amateurfunk - das fand ich
spannend.

Falls Du irgendwelche Probleme mit CSV-Daten hast - bescheid sagen.
Da kenn ich mich aus seit Turbo-Pascal-Zeiten.

Und dazu eine Anmerkung: Das Komma als Delimeter ist gefährlich:
Falls sich mal ein Komma in die Daten verirrt, stimmt die Zeile nicht mehr.

Besser sind solche ASCII-Exoten wie | oder µ .

Winni

Antworten