Array : Häufigkeit auswerten [erledigt]
Moderator: Moderatoren
- AUGE_OHR
- 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]
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 ?
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
Jimmy
- Rolf Ramacher
- 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
Hi Jimmy,
ich kenne jetzt nicht Details von deinem Array - aber würde es nicht mit AtNum() funkt.
ich kenne jetzt nicht Details von deinem Array - aber würde es nicht mit AtNum() funkt.
- brandelh
- 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
Ehrlich gesagt verstehe ich das Problem jetzt nicht
was willst du nun genau ?
1. Wie viele Zeilen mit "ID1" gibt es ?
2. oder die Summe des Betragsfeldes für die ID1 Sätze - oder gar beides ?
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 ...
Code: Alles auswählen
aDaten := { { "Beschreibung1", "ID1",2 } ,;
{ "Beschreibung2", "ID2",5 } ,;
...
{ "Beschreibungn", "IDn",2 } }
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
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
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
Hubert
- Jan
- 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
??? Was hat AtNum() denn mit Arrays zu tun? Oder mit dem Problem von Jimmy?Rolf Ramacher hat geschrieben:ich kenne jetzt nicht Details von deinem Array - aber würde es nicht mit AtNum() funkt.
Zitat aus der Hilfe der XBTools3:
JanPurpose
Determines the position of a substring within a string (multiple occurrances)
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
- AUGE_OHR
- 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
hi,
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 )
wie oft gibt es "Beschreibung1", wie oft "Beschreibung2" ... wie oft "BeschreibungXXX"brandelh hat geschrieben:was willst du nun genau ?Code: Alles auswählen
aDaten := { { "Beschreibung1", "ID1",2 } ,; { "Beschreibung2", "ID2",5 } ,; ... { "Beschreibungn", "IDn",2 } }
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
Jimmy
- brandelh
- 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
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 ++
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
Hubert
- AUGE_OHR
- 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
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 )brandelh hat geschrieben:Du hast ein Daten-Array und willst ein Summen-Array, ich denke die einzig sinnvolle Vorgehensweise ist ein zweites Array.
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
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
so nun das in ein AEVAL().
gruss by OHR
Jimmy
Jimmy
- brandelh
- 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
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.
Hier würde ich tatsächlich auf DBF (schnelles Laufwerk) und Indexdateien setzen.
Gruß
Hubert
Hubert
- AUGE_OHR
- 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
ein Array ist um Faktor 100 schneller als jede SSD !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.
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
Jimmy
- brandelh
- 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
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.
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.
Gruß
Hubert
Hubert
- brandelh
- 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
natürlich kommt es immer auf die genaue Aufgabe an, daher können wir nur Anregungen geben, probieren musst du selbst ...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 )
PS: ASORT() war hier das falsche Beispiel, ASCAN()
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.AUGE_OHR hat geschrieben:aber meine Frage beinhaltet auch wie ich ein Array mit FOR / NEXT Schleife in ein AEVAL() bekomme
Dort könnte man auch die Grenzwerte für weitere Aktionen machen ... keep it simple !
Gruß
Hubert
Hubert
- Jan
- 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
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
Jan
Mitglied der XUG Osnabrück
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
Mitglied der XUG Berlin/Brandenburg
Mitglied des Deutschsprachige Xbase-Entwickler e. V.
-
- 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
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.
Uli
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.
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: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 )
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 )
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Mitglied XuG Cologne
Mitglied XuG Osnabrück
- AUGE_OHR
- 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
die Ausgangsdatei ist eine CSV oder GPX Datei die ich mit FREAD() in ein Array einleseUliTs 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.
beide Demo Beispiele mit den FOR / NEXT Scheifen führen zum gewünschten Ergebnis.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?
Ich möchte das 2nd Beispiel in ein AEVAL() packen da ich mir bei grossen Mengen noch einen Vorteil verspreche.
gruss by OHR
Jimmy
Jimmy
- AUGE_OHR
- 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
JA KLAR ...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.
im AEVAL( ...{|aRec,i| MyFunc(aDaten,aRec,i) } ) ausführen
gruss by OHR
Jimmy
Jimmy