Hallo!
Zu Copy'n Paste:
Wenn Du Code aus einem Forum ausführst, bist Du selbst für etwaige negative Folgen verantwortlich.
Die Software zur Verwaltung von Internet-Foren ist oft nicht besonders sicher.
Es könnten sich eventuell z.B. Dritte einhacken und Änderungen an Code-Beiträgen vornehmen,
die bei Ausführung zu Datenverlusten o.ä. führen.
Es ist sehr wichtig, den heruntergeladenen Code sorgfältig zu überprüfen.
Zur Ausgabe-Datei:
Ich hatte zwei mal gefragt, zu welchem Zweck Du diese Daten benötigst und wie sie weiter verwendet
werden sollen. Das hast Du ignoriert. Dann sind auch keine gezielten Hinweise möglich.
Ich hatte davor gewarnt, daß Millionen von Datensätzen entstehen würden.
Um die Datenmenge zu begrenzen, habe ich die Gruppen weg gelassen. (Und weil mir Deine Anforderung
nicht eingeleuchtet hat.)
Übrigens: Die Ausgabe-Datei wird in meinem Beispiel mit "Append" geöffnet - eventuell benötigst
Du die Option "OutPut".
Zur Sortierung:
Bei der Ausgabe von unterschiedlichen Kombinationen (2-4) ist das Sortieren nach Häufigkeit nicht
mehr eindeutig durchführbar: innerhalb der 2er, 3er, 4er Kombis oder über alle Sätze ??
Man verwendet den Quicksort-Algorithmus, um solche Datenmengen zu bewältigen.
Hier eine weitere modifizierte Fassung der Routine NueberK_Output.
Sie erstellt die von Dir definierten Datensätze (unsortiert) als CSV-Datei: Gruppe;Kombination;Häufigkeit
Diese Datei wird - grob geschätzt- bezogen auf Deinen Input zwischen 10 und 100 Millionen Datensätzen umfassen.
Blackbox kann Dir zeigen, wie man so eine CSV effizient sortiert und abfragt per OLEDB-Treiber.
Function NueberK_Output(values() As Integer, k%, kanal_out As Integer) As _
Boolean
'Liste aller Kombinationen der Werte in Values
'values: null-basiertes Array mit Werteliste n = ubound(values)+1)
'k: Anzahl der Werte in einer Kombination
'Ausgabe in den geöffneten Ausgabekanal: kanal_out
On Error GoTo fehler
NueberK_Output = False
Dim indices%()
ReDim indices%(k - 1)
indices(0) = -1
Dim anz&, kombistr$, groups() As Integer
anz = CLng(NueberK(UBound(values) + 1, k))
If anz = -1 Then Exit Function
ReDim kombi(k - 1) As Integer
Dim i&, j%, l%, freq&
For i = 1 To anz
NextIndex indices, UBound(values) + 1
'aktuelle Kombination aus Indices ermitteln
'und AusgabeString erstellen
kombistr = ""
For j = 0 To k - 1
kombi(j) = values(indices(j))
kombistr = kombistr & CStr(kombi(j))
If j < k - 1 Then kombistr = kombistr & "-"
Next j
ReDim groups(10)
'Häufigkeit dieser Kombi in den Gruppen zählen
freq = 0
'Schleife über Werteliste in Gruppen
For j = 1 To UBound(kombis)
If ContainsAll(kombis(j).V1, kombi) Then
freq = freq + 1
If freq > UBound(groups) Then
ReDim Preserve groups(UBound(groups) + 10)
End If
'Gruppe, in der die Kombi auftritt, notieren
groups(freq) = kombis(j).Group
End If
Next j
If freq > 0 Then
'jeweils Gruppe, Kombination und Häufigkeit ausgeben
'aufgebaut als Zeile einer CSV-Datei (Strichpunkte trennen 3
' Felder)
For j = 1 To freq
Print #kanal_out, CStr(groups(j)) & ";" & kombistr & ";" & _
CStr(freq)
Next j
End If
Next i
NueberK_Output = True
Exit Function
fehler:
End Function
Beitrag wurde zuletzt am 24.02.15 um 07:50:15 editiert. |