Sortieren von CSV Datei

Rund um die LCL und andere Komponenten
Antworten
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

Sortieren von CSV Datei

Beitrag von Winni »

Hi!

Ich hatte gerade das Problem, eine CSV Datei nach einer bestimmten Spalte zu sortieren. Ich wollte die Datei nicht großartig in eine DB oder ein Grid einlesen.

Lösung: CSV Datei in eine Stringlist einlesen, meine spezialisierte Form des Quicksorts loslassen, wieder speichern.

Mein CSVsort sortiert nach jeder beliebigen Spalte, es muss angegeben werden, ob er nach Alphabet , Integer oder Float sortieren soll.

Intern benutzt das Sortieren Variants, was es etwas verlangsamt, aber den Code massiv vereinfacht. Und ist immer noch schnell:
200.000 CSV-Datensätze in 8 Sekunden.


Falls es jemand brauchen kann.

Grüße
Winni
Dateianhänge
csvsort.pas
(2.11 KiB) 80-mal heruntergeladen

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Sortieren von CSV Datei

Beitrag von Frank Ranis »

Hallo Winni,

ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??

Code: Alles auswählen

  function Str2Float(s: string): extended;
  var err : integer;
  begin
  val (s,result,err);
  if err <> 0 then result := -MaxExtended; // !!!    <-  Error: Identifier not found "MaxExtended"
  end;
Gruß

Frank
www.flz-vortex.de

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

Re: Sortieren von CSV Datei

Beitrag von theo »

Frank Ranis hat geschrieben:
Di 7. Mär 2023, 11:06
ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??
Hat er ja oben bei dem Snippet rein geschrieben:

Code: Alles auswählen

// uses math,variants
Allgemein, wenn du so eine Frage hast: Rechtsklicke auf die Fehlermeldung im Nachrichtenfenster und wähle "Suche Bezeichner", dann zeigt dir der Code Browser die Unit(s) an.

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

Re: Sortieren von CSV Datei

Beitrag von wp_xyz »

Code: Alles auswählen

  function Str2Float(s: string): extended;
  var err : integer;
  begin
  val (s,result,err);
  if err <> 0 then result := -MaxExtended; // !!!    <-  Error: Identifier not found "MaxExtended"
  end;
Wenn schon die Unit Math in der Uses-Zeile steht, dann würde ich das Ergebnis dieser Funktion beim Vorliegen eines Fehlers auf NaN setzen (Non a Number - denn das ist es ja, keine Zahl).

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Sortieren von CSV Datei

Beitrag von Frank Ranis »

Hallo ,
theo hat geschrieben:
Di 7. Mär 2023, 11:13
Frank Ranis hat geschrieben:
Di 7. Mär 2023, 11:06
ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??
Hat er ja oben bei dem Snippet rein geschrieben:

Code: Alles auswählen

// uses math,variants
Allgemein, wenn du so eine Frage hast: Rechtsklicke auf die Fehlermeldung im Nachrichtenfenster und wähle "Suche Bezeichner", dann zeigt dir der Code Browser die Unit(s) an.
math,variants stehen in uses drinn

Bei "Suche Bezeichner" wird nichts gefunden .
Vielleicht ist mein
Lazarus 2.2.0 (rev lazarus_2_2_0-0-g4d49533f10) FPC 3.2.2 x86_64-win64-win32/win64
zu alt , oder zu neu ?
wp_xyz hat geschrieben:
Di 7. Mär 2023, 18:21

Code: Alles auswählen

  function Str2Float(s: string): extended;
  var err : integer;
  begin
  val (s,result,err);
  if err <> 0 then result := -MaxExtended; // !!!    <-  Error: Identifier not found "MaxExtended"
  end;
Wenn schon die Unit Math in der Uses-Zeile steht, dann würde ich das Ergebnis dieser Funktion beim Vorliegen eines Fehlers auf NaN setzen (Non a Number - denn das ist es ja, keine Zahl).
Mit NaN wird alles kompiliert , damit werde ich nun anfangen zu testen .
Danke wp_xyz .

Gruß

Frank
www.flz-vortex.de

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

Re: Sortieren von CSV Datei

Beitrag von theo »

Hmm, Merkwürdig.
Steht das bei dir nicht auf Zeile 85 oder 87 von math.pp?
https://gitlab.com/freepascal.org/fpc/s ... as/math.pp

Trifft auf deinem System die Bedingung nicht zu?

Code: Alles auswählen

{$ifdef FPC_HAS_TYPE_EXTENDED}
    const
      MinExtended  =  3.4e-4932;
      MaxExtended  =  1.1e+4932;
{$endif FPC_HAS_TYPE_EXTENDED}
Edit: OK, auf Win64 scheint es das nicht zu geben:
https://forum.lazarus.freepascal.org/in ... ic=29678.0

Winnie sollte das also durch WP's Vorschlag ersetzen.

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Sortieren von CSV Datei

Beitrag von Frank Ranis »

Hallo theo,
theo hat geschrieben:
Mi 8. Mär 2023, 09:22
Hmm, Merkwürdig.
Steht das bei dir nicht auf Zeile 85 oder 87 von math.pp?
https://gitlab.com/freepascal.org/fpc/s ... as/math.pp

Trifft auf deinem System die Bedingung nicht zu?

Code: Alles auswählen

{$ifdef FPC_HAS_TYPE_EXTENDED}
    const
      MinExtended  =  3.4e-4932;
      MaxExtended  =  1.1e+4932;
{$endif FPC_HAS_TYPE_EXTENDED}
Edit: OK, auf Win64 scheint es das nicht zu geben:
https://forum.lazarus.freepascal.org/in ... ic=29678.0

Winnie sollte das also durch WP's Vorschlag ersetzen.
Ja , unter Linux (in meiner Virtuellen Box) wird es auch gefunden .
Ist ja super Plattform-abhängig !!!!

Gruß

Frank
www.flz-vortex.de

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

Re: Sortieren von CSV Datei

Beitrag von wp_xyz »

Bei NaN muss man nur ein bisschen aufpassen. Wiegesagt, das ist "keine Zahl", und damit kann man bestimmte Operationen, die für Zahlen gelten, nicht anstellen. Ein beliebter Fehler:

Code: Alles auswählen

var
  x: Extended;
...
  // geht nicht:
  if x = NaN then ...
  // richtig:
  if IsNaN(x) then...
Oder ein simple Operation wie y := x + 1 crasht, wenn x NaN ist. Aber das ist gut so, denn so kriegt man mit, dass das Str2Float einen fehlerhaften Eingabestring bekommen hat. Bei Winni's Result := -MaxExtended würde das durchrutschen...

Generell finde ich die TryStrTo* Funktionen günstiger als die einfachen StrTo* Funktionen, denn man muss sich schon beim Hinschreiben Gedanken machen, ob die Eingabe eine gültige Zahl ergegeben hat.

Frank Ranis
Beiträge: 201
Registriert: Do 24. Jan 2013, 21:22

Re: Sortieren von CSV Datei

Beitrag von Frank Ranis »

Hallo ,

das ist hier ja alles nicht so tragisch .

Wäre es nicht schön gewesen , wenn Winni auf seinem System z.B. die Nachricht "is not cross-platform" bekommen hätte ?
Dann hätte er sich gleich Gedanken gemacht .

Baut man solche Sachen 100fach in sein Programm ein und möchte dann von einem System aufs andere wechseln , ist der Frust doch groß.

Gruß

Frank
www.flz-vortex.de

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

Re: Sortieren von CSV Datei

Beitrag von theo »

Es gibt auch einen Bug Report zu dem Thema:
https://gitlab.com/freepascal.org/fpc/s ... sues/36108

Antworten