Array : Häufigkeit auswerten [erledigt]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Array : Häufigkeit auswerten [erledigt]

Beitrag von AUGE_OHR »

hi,

wenn ich eine DBF hätte würde ich per AADD() / ASCAN() auswerten wie oft z.b. ein Artikel verkauft wurde.

wenn ich nun ein Array (erweiterbar) habe, aus Text File eingelesen, dann frage ich mich wie ich am elegantesten ( AEVAL() ) das vorhandene Array "bearbeite" ohne ein weiteres Array ?
Zuletzt geändert von AUGE_OHR am Fr, 11. Okt 2013 0:50, insgesamt 1-mal geändert.
gruss by OHR
Jimmy
Benutzeravatar
Rolf Ramacher
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1930
Registriert: Do, 09. Nov 2006 10:33
Wohnort: Bergheim
Danksagung erhalten: 3 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von Rolf Ramacher »

Hi Jimmy,

ich kenne jetzt nicht Details von deinem Array - aber würde es nicht mit AtNum() funkt.
Gruß Rolf

Mitglied der Gruppe XUG-Cologne
www.xug-cologne.de
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von brandelh »

Ehrlich gesagt verstehe ich das Problem jetzt nicht ;-)

Code: Alles auswählen

aDaten := { { "Beschreibung1", "ID1",2 } ,;
            { "Beschreibung2", "ID2",5 } ,;
            ...
            { "Beschreibungn", "IDn",2 } }
was willst du nun genau ?

1. Wie viele Zeilen mit "ID1" gibt es ?

Code: Alles auswählen

nAnz := 0
aEval( aDaten, {|aRec| iif(aRec[2] == "ID1" ,nAnz++,nil} )
? "Anzahl ID1 Zeilen", nAnz
2. oder die Summe des Betragsfeldes für die ID1 Sätze - oder gar beides ?

Code: Alles auswählen

nAnz := 0
nSum := 0
aEval( aDaten, {|aRec| iif(aRec[2] == "ID1" ,nAnz++,nil},iif(aRec[2] == "ID1" ,nSum += aRec[3],nil} )
? "Anzahl ID1 Zeilen", nAnz, " Summe: ", nSum
3. oder ein Array mit den Anzahl / Summen von oben ?

Das ist komplexer, hier müsste man jedesmal nachsehen, ob ein Key schon benutzt wurde, da würde ich FOR NEXT nutzen ... vorher noch ASORT ...
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von Jan »

Rolf Ramacher hat geschrieben:ich kenne jetzt nicht Details von deinem Array - aber würde es nicht mit AtNum() funkt.
??? Was hat AtNum() denn mit Arrays zu tun? Oder mit dem Problem von Jimmy?

Zitat aus der Hilfe der XBTools3:
Purpose
Determines the position of a substring within a string (multiple occurrances)
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Array : Häufigkeit auswerten

Beitrag von AUGE_OHR »

hi,
brandelh hat geschrieben:

Code: Alles auswählen

aDaten := { { "Beschreibung1", "ID1",2 } ,;
            { "Beschreibung2", "ID2",5 } ,;
            ...
            { "Beschreibungn", "IDn",2 } }
was willst du nun genau ?
wie oft gibt es "Beschreibung1", wie oft "Beschreibung2" ... wie oft "BeschreibungXXX"

mit einem 2nd. Array und AADD() / ASCAN() geht das ja ganz einfach aber geht das auch mit nur einem Array ?
( kann weiter Elemente zum erweitern benutzen )
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von brandelh »

wenn ich es richtig verstehe, hast du im Datenarray 1 bis n Vorkommen einer ID und möchtest wissen, welche IDs und wie häufig sie vorkommen.

Irgendwie könnte man vielleicht Array Zeilen einfügen, die Summen sind, aber wäre das sinnvoll ?
Du hast ein Daten-Array und willst ein Summen-Array, ich denke die einzig sinnvolle Vorgehensweise ist ein zweites Array.
Das erste wird von Anfang bis Ende durchlaufen und im Zweiten wird nebem der ID noch ein Summenfeld geführt.
Beim erstem mal (also ascan schlägt fehl) aadd ( aSum, { cID, 1 } ), ansonsten hinten das Summenfeld ++
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Array : Häufigkeit auswerten

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Du hast ein Daten-Array und willst ein Summen-Array, ich denke die einzig sinnvolle Vorgehensweise ist ein zweites Array.
was aber wenn das Array schon > 1 GB ist und das 2nd Array auch so gross werden könnte ( weiss ja nicht wie viele "Dubletten" es gibt )

das wäre ein normaler Code

Code: Alles auswählen

FOR i := 1 TO iMax
   cSeek := aArray[i][1]
   nPosi :=  AScan( aFound, {|x| x[1]== cSeek} ) 
   IF nPosi > 0
       aFound[nPosi][2]++
   ELSE
       AADD(aFound,{cSeek,1})
   ENDIF
NEXT
ich kann ja als 3th. Parameter von ASCAN die Startposition einsetzten und als 4th Parameter "count".
wenn ich nun bei iMax anfange und rückwärts gehe und dann ein ASCAN einsetze :

Code: Alles auswählen

FOR i := iMax TO 1 STEP -1
   cSeek := aArray[i][1]
   nPosi :=  AScan( aArray, {|x| x[1]== cSeek},1,i-1 )
   IF nPosi > 0
       aArray[nPosi][2]++
   ENDIF
NEXT 
dann müssten sich doch alles jeweils auf dem "ersten Treffer" sammeln.
so nun das in ein AEVAL().
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von brandelh »

Bei 1 GB großen Arrays ist ASCAN und ASORT zu langsam und du mußt sie ja immer neu einlesen.
Hier würde ich tatsächlich auf DBF (schnelles Laufwerk) und Indexdateien setzen.
Gruß
Hubert
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Array : Häufigkeit auswerten

Beitrag von AUGE_OHR »

brandelh hat geschrieben:Bei 1 GB großen Arrays ist ASCAN und ASORT zu langsam und du mußt sie ja immer neu einlesen.
Hier würde ich tatsächlich auf DBF (schnelles Laufwerk) und Indexdateien setzen.
:?: :?: :?: ein Array ist um Faktor 100 schneller als jede SSD !

der Code von beiden FOR / NEXT Schleifen funktioniert ja. ein ASCAN() ist schnell und "kostet" fast nichts.
(durch den 3th und 4th Parameter von ASCAN() würde die Begrenzung immer kleiner werden ...)

ein ASORT ist sicherlich von der Grösse eines Array abhängig aber ich würde den ja nur 1 x am Ende des 2nd. Code verwenden
um an die "Dubletten" zu kommen ( alle anderen wären ja nur 1 x = default )

aber meine Frage beinhaltet auch wie ich ein Array mit FOR / NEXT Schleife in ein AEVAL() bekomme ;)
gruss by OHR
Jimmy
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von brandelh »

Hi,

ich hatte das auch immer gedacht, aber bei sehr großen Arrays die mehrfach ASCAN() benötigen, muss ASCAN() immer wieder vom Anfang an suchen.
Eine DBF sequentiell durchlaufen und SEEK auf die zweite mit Index war bei meinen damaligen Tests schneller ... ich hatte aber sicher auch weniger RAM damals.

PS: ein Porsche ist viel schneller als ein LKW, wenn er aber 1000 Brötchen einzeln abholen und abliefern muss, ist der LKW doch schneller der nur einmal die Runde fährt. :D
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von brandelh »

AUGE_OHR hat geschrieben: ein ASORT ist sicherlich von der Grösse eines Array abhängig aber ich würde den ja nur 1 x am Ende des 2nd. Code verwenden
um an die "Dubletten" zu kommen ( alle anderen wären ja nur 1 x = default )
natürlich kommt es immer auf die genaue Aufgabe an, daher können wir nur Anregungen geben, probieren musst du selbst ...
PS: ASORT() war hier das falsche Beispiel, ASCAN()
AUGE_OHR hat geschrieben:aber meine Frage beinhaltet auch wie ich ein Array mit FOR / NEXT Schleife in ein AEVAL() bekomme ;)
aEval(aDaten.{|aRec,i| ... }) ersetzt eine einfache FOR NEXT, wenn die Aktion mehr als nur eine / wenige Zeilen umfasst, sollte man sie in eine Funktion packen und die Funktion aufrufen.
Dort könnte man auch die Grenzwerte für weitere Aktionen machen ... keep it simple !
Gruß
Hubert
Benutzeravatar
Jan
Marvin
Marvin
Beiträge: 14651
Registriert: Fr, 23. Sep 2005 18:23
Wohnort: 49328 Melle
Hat sich bedankt: 21 Mal
Danksagung erhalten: 88 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von Jan »

Die Schwierigkeit wird sein, überhaupt erst einmal ein so großes Array aufzubauen. Xbase++ stürzt nämlich ohne jedes Zucken oder eine irgendeine Rückmeldung ab, wenn man mehr als 400.000 (?) Arrayelemente einliest. Da hilft nur eine modifizierte dll von Alaska und ein entsprechender Eintrag in der .arc. Ich habe das damit auf 800.000 Elemente hochgeschraubt, ohne die von Alaska prognostizierten Performance-Nachteile.

Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Array : Häufigkeit auswerten

Beitrag von UliTs »

Wenn man nicht gerade ein "Single-User-Program" schreibt, würde ich bei so etwas auf einen Datenbankserver setzen, der dann die Arbeit übernimmt.
In solchen Fällen ist meines Erachtens nicht die (lokale) Festplatte oder die Bearbeitung des lokalen Arrays der begrenzende Faktor, sondern die Menge des Datenverkehrs.
AUGE_OHR hat geschrieben:...
wie oft gibt es "Beschreibung1", wie oft "Beschreibung2" ... wie oft "BeschreibungXXX"

mit einem 2nd. Array und AADD() / ASCAN() geht das ja ganz einfach aber geht das auch mit nur einem Array ?
( kann weiter Elemente zum erweitern benutzen )
Was meinst Du damit genau? Möchtest Du z.B. eine Funktion schreiben, die als Parameter "Beschreibung1" hat und die Anzahl der Vorkommen von "Beschreibung1" zurückgibt? Das geht so:

Code: Alles auswählen

? AnzahlDaten( @aDaten,"Beschreibung1"/*cText*/ )

FUNCTION AnzahlDaten( aDaten,cText )
LOCAL nResult:=0
  AScan( aDaten,{|aZeile|IIF( aZeile[1]==cText,nResult++,NIL )}
RETURN( nResult )
Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Array : Häufigkeit auswerten

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Wenn man nicht gerade ein "Single-User-Program" schreibt, würde ich bei so etwas auf einen Datenbankserver setzen, der dann die Arbeit übernimmt.
In solchen Fällen ist meines Erachtens nicht die (lokale) Festplatte oder die Bearbeitung des lokalen Arrays der begrenzende Faktor, sondern die Menge des Datenverkehrs.
die Ausgangsdatei ist eine CSV oder GPX Datei die ich mit FREAD() in ein Array einlese
UliTs hat geschrieben:Was meinst Du damit genau? Möchtest Du z.B. eine Funktion schreiben, die als Parameter "Beschreibung1" hat und die Anzahl der Vorkommen von "Beschreibung1" zurückgibt?
beide Demo Beispiele mit den FOR / NEXT Scheifen führen zum gewünschten Ergebnis.
Ich möchte das 2nd Beispiel in ein AEVAL() packen da ich mir bei grossen Mengen noch einen Vorteil verspreche.
gruss by OHR
Jimmy
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12906
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 45 Mal

Re: Array : Häufigkeit auswerten

Beitrag von AUGE_OHR »

brandelh hat geschrieben:aEval(aDaten.{|aRec,i| ... }) ersetzt eine einfache FOR NEXT, wenn die Aktion mehr als nur eine / wenige Zeilen umfasst, sollte man sie in eine Funktion packen und die Funktion aufrufen.
JA KLAR #-o ...
im AEVAL( ...{|aRec,i| MyFunc(aDaten,aRec,i) } ) ausführen :thumbright:
gruss by OHR
Jimmy
Antworten