Sortieren von CSV Datei
- 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
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
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
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
Re: Sortieren von CSV Datei
Hallo Winni,
ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??
Gruß
Frank
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;
Frank
www.flz-vortex.de
Re: Sortieren von CSV Datei
Hat er ja oben bei dem Snippet rein geschrieben:Frank Ranis hat geschrieben: ↑Di 7. Mär 2023, 11:06ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??
Code: Alles auswählen
// uses math,variants
Re: Sortieren von CSV Datei
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).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;
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
Re: Sortieren von CSV Datei
Hallo ,
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 ?
Danke wp_xyz .
Gruß
Frank
math,variants stehen in uses drinntheo hat geschrieben: ↑Di 7. Mär 2023, 11:13Hat er ja oben bei dem Snippet rein geschrieben:Frank Ranis hat geschrieben: ↑Di 7. Mär 2023, 11:06ich wollte deine Routine ausprobieren , aber ich stolpere über "MaxExtended" .
In welcher Unit ist das zu finden ??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.Code: Alles auswählen
// uses math,variants
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 ?
Mit NaN wird alles kompiliert , damit werde ich nun anfangen zu testen .wp_xyz hat geschrieben: ↑Di 7. Mär 2023, 18:21Wenn 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).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;
Danke wp_xyz .
Gruß
Frank
www.flz-vortex.de
Re: Sortieren von CSV Datei
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?
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.
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}
https://forum.lazarus.freepascal.org/in ... ic=29678.0
Winnie sollte das also durch WP's Vorschlag ersetzen.
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
Re: Sortieren von CSV Datei
Hallo theo,
Ist ja super Plattform-abhängig !!!!
Gruß
Frank
Ja , unter Linux (in meiner Virtuellen Box) wird es auch gefunden .theo hat geschrieben: ↑Mi 8. Mär 2023, 09:22Hmm, 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?Edit: OK, auf Win64 scheint es das nicht zu geben:Code: Alles auswählen
{$ifdef FPC_HAS_TYPE_EXTENDED} const MinExtended = 3.4e-4932; MaxExtended = 1.1e+4932; {$endif FPC_HAS_TYPE_EXTENDED}
https://forum.lazarus.freepascal.org/in ... ic=29678.0
Winnie sollte das also durch WP's Vorschlag ersetzen.
Ist ja super Plattform-abhängig !!!!
Gruß
Frank
www.flz-vortex.de
Re: Sortieren von CSV Datei
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:
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.
Code: Alles auswählen
var
x: Extended;
...
// geht nicht:
if x = NaN then ...
// richtig:
if IsNaN(x) then...
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.
-
- Beiträge: 201
- Registriert: Do 24. Jan 2013, 21:22
Re: Sortieren von CSV Datei
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
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
Re: Sortieren von CSV Datei
Es gibt auch einen Bug Report zu dem Thema:
https://gitlab.com/freepascal.org/fpc/s ... sues/36108
https://gitlab.com/freepascal.org/fpc/s ... sues/36108