AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Array of records zellegen

Ein Thema von IMPEGA · begonnen am 22. Mär 2023 · letzter Beitrag vom 22. Mär 2023
Antwort Antwort
Seite 1 von 2  1 2      
IMPEGA
Online

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#1

Array of records zellegen

  Alt 22. Mär 2023, 07:33
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ß.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Array of records zellegen

  Alt 22. Mär 2023, 07:40
.. auch wenn es am Thema vorbeigeht, schonmal über eine (sql) Datenbank nachgedacht?
Das schreit ja förmlich danach.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
IMPEGA
Online

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#3

AW: Array of records zellegen

  Alt 22. Mär 2023, 08:34
Nein, kann ich nicht. Ich bekomme die daten schon in der Form. Möchte hier nicht die Details erklären.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#4

AW: Array of records zellegen

  Alt 22. Mär 2023, 09:09
Nein, kann ich nicht. Ich bekomme die daten schon in der Form.
Egal wie du sie bekommst:
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.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
IMPEGA
Online

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#5

AW: Array of records zellegen

  Alt 22. Mär 2023, 10:17
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.

Geändert von IMPEGA (22. Mär 2023 um 10:20 Uhr)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.159 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Array of records zellegen

  Alt 22. Mär 2023, 10:35
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 Spring4D-Bibliothek für Delphi anzuschauen, die darin enthaltenen Collections sind großartig und erinnern mit ihren Möglichkeiten zur Filterung und Sortierung an LINQ aus .NET.

Hier ein Beispiel für deine Autos:
Delphi-Quellcode:
   bmws := autos.Where(
      function(const auto: TAuto): Boolean
      begin
         Result := (auto.Marke = 'BMW');
      end
   );
Oder du willst nur wissen, ob von den BMWs wenigstens einer defekt ist:

Delphi-Quellcode:
bmws.Any(
      function(const auto: TAuto): Boolena
      begin
         Result := (auto.Notiz = 'Defekt')
      end
   )
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.
  Mit Zitat antworten Zitat
Benutzerbild von jaenicke
jaenicke

Registriert seit: 10. Jun 2003
Ort: Berlin
9.586 Beiträge
 
Delphi 11 Alexandria
 
#7

AW: Array of records zellegen

  Alt 22. Mär 2023, 11:26
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.
Das ist von der Verwendung her kaum anders als du es aktuell vermutlich machst. Auch die Sortierung wäre mit Pointern sehr viel schneller.
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';

Schau dir Spring4D mal an, danach weißt du nicht mehr, wie du jemals ohne konntest.
Ja, damit kann man sehr viel machen, aber bei größeren Datenmengen muss man auch auf die Performance achten. Spring4D ist da zwar sehr gut, aber es hat natürlich trotzdem einen gewissen Overhead. Da muss man dann schauen, was im konkreten Anwendungsfall wichtiger ist: Der Komfort der Spring4D Bibliothek oder die Performance.
Sebastian Jänicke
Alle eigenen Projekte sind eingestellt, ebenso meine Homepage, Downloadlinks usw. im Forum bleiben aktiv!
  Mit Zitat antworten Zitat
IMPEGA
Online

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#8

AW: Array of records zellegen

  Alt 22. Mär 2023, 11:48
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.
  Mit Zitat antworten Zitat
Benutzerbild von ConnorMcLeod
ConnorMcLeod

Registriert seit: 13. Okt 2010
Ort: Bayern
490 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Array of records zellegen

  Alt 22. Mär 2023, 11:51
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
Nr.1 Delphi-Tool: [F7]
  Mit Zitat antworten Zitat
IMPEGA
Online

Registriert seit: 19. Jan 2008
Ort: Brhv
83 Beiträge
 
Delphi 10.2 Tokyo Professional
 
#10

AW: Array of records zellegen

  Alt 22. Mär 2023, 12:27
@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.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:13 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz