![]() |
Array of records zellegen
Hallo.
Amateur schon wieder. :) Ich habe ein Aufgabe mit Array of record , die mein Können übersteigt. Ich habe Records in dieser Form type TAuto = record Marke: string; Farbe: string; Baujahr: string; KM: string; Notiz: string; end; Nun erfasse ich die ganzen daten. Hier ein Abschnitt ('BMW','rot','2011','203431','') ('Toyota','blau','2022','12568','Rücksendung') ('BMW','blau','2018','58223','') ('Nissan','blau','2021','17698','Defekt') ('BMW','weiß','2022','14924','') ('Toyota','blau','2020','29164','') So geht es weiter, es sind immer unterschiedliche Daten Nun zu meinem Vorhaben. Ich möchte möglichst einfach und schnell (Datensätze sind relativ groß 5-50Mb groß) jede Marke in ein separates Array erfassen Sortieren kann ich, brauche aber die Daten i je einem Array. Also diesen Array in Array of Array of Records übertragen Der Weg wäre egal, ob neue Arrays erstellt werden oder in vorhandene Arrays übertragen. Man kann Sie danach zusammenfügen. Aber, ich kenne nie die Zahl der Fahrzeuge und welche Marke heute erfasse wird. Es ist jedes Mal anders. Also kann ich nicht einfach sagen, ich erfasse alle BMW, dann Toyota u.s.w. Welche Name auftaucht ist nicht zu bestimmen. Ach ja, weil noch Fehler in der Form auftauchen. Marzedes, Merzedez u.s.w Ich muss einfach erst die Marke erkennen und in gleichnamige Array mit der Marke hinzufügen. Selbst wenn es TOOOOyotaaa heißt ('BMW','rot','2011','203431','') ('BMW','blau','2018','58223','') ('BMW','weiß','2022','14924','') ('Toyota','blau','2022','12568','Rücksendung') ('Toyota','blau','2020','29164','') ('Nissan','blau','2021','17698','Defekt') Bitte um Impulse, wie ich es machen kann. Ich wiederhole, Datensätze sind meist ziemlich groß. |
AW: Array of records zellegen
.. auch wenn es am Thema vorbeigeht, schonmal über eine (sql) Datenbank nachgedacht?
Das schreit ja förmlich danach. Grüße Klaus |
AW: Array of records zellegen
Nein, kann ich nicht. Ich bekomme die daten schon in der Form. Möchte hier nicht die Details erklären.
|
AW: Array of records zellegen
Zitat:
Du kannst sie auch im Speicher in ein Dataset packen und dann damit arbeiten, ohne die Daten irgendwo auf einem Datenträger zu speichern. Du könntest auch mit Array von Pointern für die einzelnen Marken arbeiten, womit das Kopieren der Recordinhalte wegfiele. Wenn du aber vorher ein großes Array und hinterher mehrere kleine Arrays hast und das "nicht verhandelbar" ist, bleibt nicht viel Optimierungspotential übrig. Dass du die Länge der Ziel-Arrays am Anfang oder in Schritten setzen solltest und am Ende korrigieren, dürfte klar sein. Viel mehr kannst du dann aber kaum tun. |
AW: Array of records zellegen
Danke erstmal.
Das klingt nicht gerade vielversprechend. Shit, ich habe gehofft, Ihr habt irgendwelche Tricks auf Lager. Zaubern kann man aber nicht, das ist mir schon klar. Das ist kein Profi bin und etwas überfordert bin, sollte auch klar sein. Array in Verbindung mit Pointer, scheint mir doch etwas zu kompliziert für mich. @jaenicke Könntest du mir nur ein sehr einfaches Beispiel zeigen. Nur um zu sehen, ob ich es angreifen mag. Nur um zu sehen ob ich es überhaupt versuchen soll. Ich werte zwar noch weiter Antworten ab, mache mir da aber kaum Hoffnung auf leichte Lösung. Momentan, ist das ein Kraftakt. Ich sortiere mein Array und kopiere praktisch per Hand immer die passenden Gruppen heraus. |
AW: Array of records zellegen
Dass du alle Daten in Records bereits im Speicher hast ist doch eigentlich was cooles. Das mit der SQL-Datenbank war sicher gut gemeint, aber nur um Sortierung/Gruppierung nicht selbst machen zu müssen würde ich das jetzt auch als Overkill empfinden.
Mit den in Delphi enthaltenen Bordmitteln macht das Filtern, Gruppieren und sonstiges aber auch wirklich keinen Spaß. Ich würde dir wirklich empfehlen, dir mal die ![]() Hier ein Beispiel für deine Autos:
Delphi-Quellcode:
Oder du willst nur wissen, ob von den BMWs wenigstens einer defekt ist:
bmws := autos.Where(
function(const auto: TAuto): Boolean begin Result := (auto.Marke = 'BMW'); end );
Delphi-Quellcode:
Um ein paar vernünftige Collections mit den Möglichkeiten kommt man mittelfristig eigentlich nicht umher, haben andere Programmiersprachen ja auch schon direkt in ihrer Standardbibliothek. Wärmste Empfehlung: Schau dir Spring4D mal an, danach weißt du nicht mehr, wie du jemals ohne konntest.
bmws.Any(
function(const auto: TAuto): Boolena begin Result := (auto.Notiz = 'Defekt') end ) |
AW: Array of records zellegen
Zitat:
Delphi-Quellcode:
type
TAuto = record Marke: string; Farbe: string; Baujahr: string; KM: string; Notiz: string; end; PAuto = ^TAuto; var MyBaseArray: TArray<TAuto>; MySortArray: TArray<PAuto>; SetLength(MySortArray, Length(MyBaseArray)); // extrahieren der Pointer als Array SetLength(MySortArray, Length(MyBaseArray)); for i := Low(MyBaseArray) to High(MyBaseArray) do MySortArray[i] := @MyBaseArray[i]; // Zugriff MySortArray[i].Baujahr := '1'; // compiler magic / pointer magic, keine Dereferenzierung notwendig MySortArray[i]^.Baujahr := '1'; Zitat:
|
AW: Array of records zellegen
Danke an Alle.
Ich bevorzuge aber bei Arrays zu bleiben. @jaenicke danke dir noch mal. Zumindest verstehe ich den Code, das ist schon mal gut. Darauf kann ich etwas aufbauen. Vor allen, weil die Performance für mich recht wichtig ist. |
AW: Array of records zellegen
Ja, Spring4D bzw Listen wären auch meine ersten Gedanken gewesen.
Wenn es denn unbedingt Arrays sein müssen, wäre mein Ansatz, erstmal ein Enum für die Automarken zu machen. TAutoMarke = (amUnknown, amBMW, amMercedes, amToyota etc.); Dann ein 2dimensionales Array TAllesEinerMarke = array of [TAuto]; TAlleAutosProMarke = array[TAutoMarke] of TAllesEinerMarke; Dann ein Dictionary aller möglichen Benamsungen TMarkenBenamsung = TDictionary<TAutoMarke, string>; ... zB amMercedes mit 'Marzedes,Merzedec,blah' Danach kannste das Originalarray in einer Schleife durchwandern und im Dictionary suchen. Dann abhängig von der gefundenen Benamsung in das entsprechende TAutoMarke-Unterarray innerhalb TAlleAutosProMarke kopieren. Nur mal so aus dem Kopf ohne Gewehr ;-) |
AW: Array of records zellegen
@ConnorMcLeod
Damit muss ich aber die Voraussetzung erfüllen, alle Namen zu kennen oder aufnehmen. Keine Chance. Wie soll das gehen, wenn ich ein 90MB Datei bekomme, die 800 Namen enthaltet? Es sind nicht immer Autos, es können auch Teile von Autos sein. Reifen, Kupplungen, Lenker...... und in 2 Tagen ist es dann eine 48Mb Liste mit 1300 andere Namen. U.s.w Ganze selten 5Mb mit 60 Namen. Wir reden hier von Unmengen an Namen, die möglich sind. Ich habe ein Beispiel mit Autos angegeben, damit Ihr erst versteht, was ich zu erfüllen habe. Das Ganze ist doch etwas komplizierter. Ich muss nur den Weg finden, danach wird es schon gehen. Ich denke, der Ansatz mit Pointer bringt mich weiter. Schon alleine wegen der Performance. Als kein Profi muss ich mich allerdings erst etwas einlesen. So ganz auf die Schnelle wird es nicht gehen, und nur halb funktionieren darf es auch nicht. Dennoch bin ich für jeden Anstoß dankbar. Momentan denke ich an sowas. Ich extrahiere die Pointer als Array dabei erfasse ich die Namen in einer separaten Liste. (Damit habe ich schon die heutigen, möglichen Namen) Die Daten werden nämlich nur nach Namen gruppiert. Nie anders. Damit ist nur "Marke: string;" für mich von Bedeutung. (In echt heißt es Item : string;) Nun muss ich jeden Wert aus der Liste im MySortArray suchen. Ich denke, suchen im Speicheradresse läuft schnell. Ziemlich lange wird es trotzdem dauern, dennoch wird es eine Verbesserung zu jetziger Methode. Auf das Beste hoffen, ist meine Devise. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:31 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