| |
Visual-Basic EinsteigerRe: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 22.01.13 13:23 |
| Hallo!
Haben wir solche Sachen nicht schon gelegentlich besprochen?
Am besten, Du beschreibst Deine Zielstellung etwas genauer.
Geht es nur um die Werte-Paare oder auch darum, an welcher
Position in der Zeile die Werte jeweils stehen?
Können das irgendwelche Werte sein oder gibt es einen Werte-Vorrat
aus dem die Ausprägungen in den Zeilen entnommen worden sind?
Ich würde ein UDT-Array nutzen: Wert1, Wert2, Häufigkeit
Füllen in einer mehrfach geschachtelten Schleife (Variablen-Paarung, Zeilen).
MfG
Manfred | |
Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 22.01.13 09:59 |
| hallo,
ich bräuchte mal wieder eure Hilfe
Input #1, i1, i2, i3, i4
Also als input habe ich eine txt datei mit diesem inhalt:
3 , 4 , 7 , 10
3 , 4 , 7 , 16
3 , 4 , 7 , 30
3 , 4 , 7 , 31
3 , 4 , 7 , 41
3 , 4 , 7 , 46
3 , 4 , 8 , 10
3 , 4 , 8 , 30
3 , 4 , 8 , 31
3 , 4 , 8 , 41
3 , 4 , 18 , 30
3 , 4 , 18 , 31
3 , 4 , 18 , 41
3 , 4 , 18 , 46
3 , 4 , 21 , 30
3 , 4 , 21 , 31
3 , 4 , 21 , 41
3 , 4 , 21 , 43
3 , 4 , 21 , 46
3 , 4 , 25 , 30
3 , 4 , 25 , 31
3 , 4 , 25 , 41
3 , 4 , 25 , 43
3 , 4 , 25 , 46
3 , 4 , 27 , 30
3 , 4 , 27 , 31
3 , 4 , 27 , 41
3 , 4 , 27 , 43
3 , 4 , 27 , 46
3 , 4 , 33 , 41
3 , 4 , 33 , 46
3 , 4 , 39 , 41
3 , 4 , 40 , 41
3 , 4 , 40 , 43
3 , 4 , 40 , 46
3 , 7 , 19 , 30
3 , 7 , 19 , 31
3 , 7 , 19 , 41
3 , 7 , 19 , 46
3 , 7 , 23 , 30
3 , 7 , 23 , 31
3 , 7 , 23 , 41
3 , 7 , 23 , 43
3 , 7 , 23 , 46
3 , 7 , 35 , 41
3 , 7 , 35 , 43
usw.
usw.
ca. 2000 solcher Reihen, die Reihen sind zwar schön geordnet es könnte jedoch
auch vorkommen das diese nicht geordnet vorliegen.
Es geht nur um die i2 und i3 Kombi als output.
die erste Zahl ist i1
die zweite Zahl ist i2
die dritte Zahl ist i3
die vierte Zahl ist i4
nun möchte ich gerne wissen, wie oft eine 2-er-Kombination aus i2 und i3 vorhanden ist.
Ausgabe vielleicht so in eine txt Datei:
4-7 = 6
4-8 = 4
7-35 = 2
usw.
usw.
wie könnte ich das am einfachsten realisieren?
Danke vorab nochmals
LG
Angelina | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 22.01.13 13:38 |
| hallo,
hm.... ich dachte ich hätte es gut erklärt
also in einer bestehenden txt Datei sind diese Werte:
3 , 4 , 7 , 10
3 , 4 , 7 , 16
3 , 4 , 7 , 30
3 , 4 , 7 , 31
3 , 4 , 7 , 41
3 , 4 , 7 , 46
3 , 4 , 8 , 10
3 , 4 , 8 , 30
3 , 4 , 8 , 31
3 , 4 , 8 , 41
3 , 4 , 18 , 30
3 , 4 , 18 , 31
3 , 4 , 18 , 41
3 , 4 , 18 , 46
3 , 4 , 21 , 30
3 , 4 , 21 , 31
3 , 4 , 21 , 41
3 , 4 , 21 , 43
3 , 4 , 21 , 46
3 , 4 , 25 , 30
3 , 4 , 25 , 31
3 , 4 , 25 , 41
3 , 4 , 25 , 43
3 , 4 , 25 , 46
3 , 4 , 27 , 30
3 , 4 , 27 , 31
3 , 4 , 27 , 41
3 , 4 , 27 , 43
3 , 4 , 27 , 46
3 , 4 , 33 , 41
3 , 4 , 33 , 46
3 , 4 , 39 , 41
3 , 4 , 40 , 41
3 , 4 , 40 , 43
3 , 4 , 40 , 46
3 , 7 , 19 , 30
3 , 7 , 19 , 31
3 , 7 , 19 , 41
3 , 7 , 19 , 46
3 , 7 , 23 , 30
3 , 7 , 23 , 31
3 , 7 , 23 , 41
3 , 7 , 23 , 43
3 , 7 , 23 , 46
3 , 7 , 35 , 41
3 , 7 , 35 , 43
usw.
usw.
Wenn ich nun diese Datei als input nehme
i1,i2,i3,i4
dann soll von oben nach unten die erste i2 und i3 (bilden eine Kombi)
geprüft werden (nach unten in der Datei) wie oft diese vorhanden ist.
Dann ist der erste Prüfvorgang abgeschlossen und es wird die zweite
Zeile genommen. Auch wieder nur i2 und i3.
Wurde diese Kombi bereits im Vorweld ermittelt und gezählt dann braucht
sie bei diesem Durchlauf nicht mehr gezählt werden.
Sobald eine Zeile mit i2 und i3 kommt, die noch nicht gezählt wurde dann
wird diese gezählt.
Ausgabe vielleicht so in eine txt Datei:
4-7 = 6
4-8 = 4
7-35 = 2
usw.
usw.
Versteht man mich nun besser?
LG
Angelina | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 22.01.13 13:50 |
| Das ist in dieser Form keine Programmieraufgabe!
Das wäre Instant-Code, den man nach Gebrauch wegwirft.
Meine Fragen sind nicht beantwortet.
Du mußt doch versuchen, eine allgemein verwendbare
(über Parameter gesteuerte) Funktion zu erstellen, z.B.
- variable Anzahl von Werten pro Zeile
- Vorgabe von zu den einzubeziehenden Positionen (auch Anzahl usw.)
- Wertevorrat (z.B. Aussonderung unplausibler Zeilen)
- usw. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 22.01.13 14:17 |
| hallo,
wie so ist eine Zählfunktion keine Programmieraufgabe?
Ansonsten verstehe ich nur Bahnhof - sorry
Ich wollte nur zählen lassen!
Die Input Datei schaut zwar immer so aus - jedoch von Woche zu Woche
unterschiedliche Zahlen vorhanden!
LG
Angelina
Beitrag wurde zuletzt am 22.01.13 um 14:18:37 editiert. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 22.01.13 14:52 |
| Was Du schilderst, ist aber noch nicht hinreichend,
um eine Funktion abzuleiten.
[I]"Die Input-Datei schaut zwar immer so aus."[/I]
Wie?
Erforderlicher Datentyp der Werte (Ausprägungsbereich): Integer, Long, Single?
Anzahl der Werte pro Spalte: fix oder variabel?
Trennzeichen zwischen Werten: fix oder variabel?
Auszuzählende Spalten-Positionen: fix oder variabel?
Anzahl der auszuzählenden Positionen (immer zwei oder 1,2,3,4 ..)
Datenabgleich: Können Werte fehlen oder Ausprägungen unplausibel sein?
Was hast Du bisher codiert?
Und woran ist es gescheitert?
Beitrag wurde zuletzt am 22.01.13 um 14:55:14 editiert. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 22.01.13 16:21 |
| hallo,
hier liegt die Datei:
http://neuer.altervista.org/Forum/Input-Angelina.txt
Wie würdest du jetzt mit VB6 diese Datei öffnen (input)
und herausfinden wollen, wie oft z.B. die Kombination
aus dem dort stehenden ersten Paar 4 , 7 (welches ja bereits dort steht)
noch in der o.g. Datei vorhanden ist?
Es bezieht sich nur auf i2 und i3
i1, i2, i3, i4
3 , 4 , 7 , 10
LG
Angelina | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 22.01.13 16:34 |
| Hallo!
Ganz trivial etwa so:
Dim fc As Integer, i1%, i2%, i3%, i4&
fc = FreeFile
Open "C:\daten\demodaten.txt" For Input As #fc
Dim i2_col As New Collection, i3_col As New Collection
Dim freq(10000) As Integer 'Eventuell mit Redim Preserve dynamisch verländern
Dim index As Integer, vorhanden As Boolean
While Not EOF(fc)
Input #fc, i1, i2, i3, i4
vorhanden = False
For index = 1 To i2_col.count
If i2_col(index) = i2 And i3_col(index) = i3 Then
freq(index) = freq(index) + 1: vorhanden = True: Exit For
End If
Next index
If Not vorhanden Then
i2_col.Add (i2): i3_col.Add (i3): freq(i2_col.count) = 1
End If
Wend
Close #fc
Open "C:\daten\demoresult.txt" For Output As #fc
For index = 1 To i2_col.count
Print #fc, CStr(i2_col(index)) & " - " & CStr(i3_col(index)) & _
": " & CStr(freq(index))
Next index
Close #fc Aber: Eigentlich sollte der Dateiinhalt beim Lesen geprüft werden.
Wenn diese Zahlen eine bestimmte Bedeutung haben, sollten geeignete
Datenstrukturen erstellt werden.
Beitrag wurde zuletzt am 22.01.13 um 16:36:03 editiert. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 23.01.13 06:51 |
| hallo Manfred,
das hat ja alles auf Anhieb gepasst unglaublich wie schnell du so etwas
umsetzen kannst - Daumen hoch !!!
Sorry, wenn ich mich umständlich in meiner Beschreibung ausgedrückt habe.
Beim dem nun vorliegenden Ergebnis in der Enddatei
"C:\daten\demoresult.txt"
ist mir aufgefallen, das ich etwas entscheidendes vergessen habe
Du hast ja (nach meiner Vorgabe richtig) auf i2 und i3 prüfen/zählen lassen - ist auch so wie es
jetzt ist alles so richtig.
Jedoch gibt es nun in der demoresult.txt gezählte Kombinationen die dort nicht brauchbar sind.
(Hat sich jetzt erst ergeben - wie immer!)
Und zwar solche (sind unbrauchbar) die mind. eine Zahl aus der demodaten.txt
haben, die auf einer x-beliebigen Stelle von demodaten.txt auf i1 oder i4 stehen.
Also ist in unserer demoresult.txt eine Zahl (egal ob i2 oder i3) eine die auf
i1 oder i4 der demodaten.txt steht, dann fliegt diese Kombi i2,i3 raus und braucht
daher nicht in der Enddatei demoresult.txt gedruckt werden.
In unserer demodaten.txt sind dies dann die Zahlen:
3 (i1)
10(i4)
16(i4)
30(i4)
31(i4)
41(i4)
43(i4)
46(i4)
Hat eine 2er-Kombi eine dieser Zahlen dann fliegt sie raus und erscheint nicht in der
demoresult.txt
Danke nochmals für deine Zeit !
LG
Angelina | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 23.01.13 11:56 |
| [I]Und zwar solche (sind unbrauchbar) die mind. eine Zahl aus der demodaten.txt
haben, die auf einer x-beliebigen Stelle von demodaten.txt auf i1 oder i4 stehen.[/I]
x-beliebige Stelle von demodaten?
Ich nehme an, diese Aussage bezieht sich auf die Zahlen-Konstellation
in jeweils einer Zeile (nicht auf die gesamte Datei).
Vielleicht eine zusätzliche Bedingung zum Filtern der
verbotenen Sätze einbauen?
While Not EOF(fc)
Input #fc, i1, i2, i3, i4
vorhanden = False
If Not (i1 = i2 or i1 = i3 _
or i4 = i2 or i4 = i3) Then
For index = 1 To i2_col.count
If i2_col(index) = i2 And i3_col(index) = i3 Then
freq(index) = freq(index) + 1: vorhanden = True: Exit For
End If
Next index
If Not vorhanden Then
i2_col.Add (i2): i3_col.Add (i3): freq(i2_col.count) = 1
End If
End If
Wend
Beitrag wurde zuletzt am 23.01.13 um 12:05:15 editiert. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 24.01.13 06:05 |
| hallo Manfred,
leider haben wir uns nicht verstanden.
---------------------------------------------------------------------------------------
Ich schrieb u.a.
3 (i1)
10(i4)
16(i4)
30(i4)
31(i4)
41(i4)
43(i4)
46(i4)
Hat eine 2er-Kombi eine dieser Zahlen dann fliegt sie raus und erscheint nicht in der
demoresult.txt
---------------------------------------------------------------------------------------
In der demodaten.txt gibt es i1 i2 i3 i4
i2 und i3 haben wir ja schon behandelt (gezählt)
i1 und i4 nicht
alle Zahlen die auf i1 und i4 stehen - dürfen in keiner - egal welcher Zeile -
der demoresult.txt vorkommen.
Also wenn ich die demodaten.txt öffne sehe ich das auf i1 nur die Zahl 3 steht.
Somit darf es keine 3 in der demoresult.txt geben.
Dito dazu mit den Zahl die auf i4 in der gesamten Datei stehen.
10(i4)
16(i4)
30(i4)
31(i4)
41(i4)
43(i4)
46(i4)
Danke nochmals für deine Hilfe/Zeit
LG
Angelina | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 24.01.13 07:24 |
| Hallo!
Das eben war die Frage. Einzelne Zeile oder gesamte Datei als
Selektionskriterium.
Zunächst eine kleine Hilfsfunktion, um zu testen, ob ein
Wert bereits in einer Collection enthalten ist.
Public Function Contains(col As Collection, vl As Variant) As Boolean
Contains = False
Dim index As Integer
For index = 1 To col.count
If col(index) = vl Then Contains = True: Exit For
Next index
End Function Und so könnte es dann funktionieren ...
(Übrigens wäre alles einfacher zu verstehen und die Hinweise
zielgerichteter, wenn der Sinn dieser Operationen erklärt worden
wäre.)
Dim fc%, i1%, i2%, i3%, i4%
fc = FreeFile
'1. Ermittlung der Werte in Spalte 1 und Spalte 4
Open "C:\daten\demodaten.txt" For Input As #fc
Dim i1_col As New Collection, i4_col As New Collection
While Not EOF(fc)
Input #fc, i1, i2, i3, i4
If Not Contains(i1_col, i1) Then i1_col.Add i1
If Not Contains(i4_col, i4) Then i4_col.Add i4
Wend
Close #fc
'2. gefilterte Häufigkeit der Zahlenkombinationen in Spalte 2 / 3
Open "C:\daten\demodaten.txt" For Input As #fc
Dim i2_col As New Collection, i3_col As New Collection
Dim freq(10000) As Integer
Dim index As Integer, count As Integer, vorhanden As Boolean
While Not EOF(fc)
Input #fc, i1, i2, i3, i4
vorhanden = False
If Not (Contains(i1_col, i2) Or Contains(i1_col, i3) _
Or Contains(i4_col, i2) Or Contains(i4_col, i3)) Then
vorhanden = False
For index = 1 To i2_col.count
If i2_col(index) = i2 And i3_col(index) = i3 Then
freq(index) = freq(index) + 1: vorhanden = True: Exit For
End If
Next index
If Not vorhanden Then
i2_col.Add (i2): i3_col.Add (i3): freq(i2_col.count) = 1
End If
Else
'Bedingung: gefilterter Datensatz
'.....
End If
Wend
Close #fc
'3. Füllen der Ergebnisdatei: gefilterte Zahlenkombis, Häufigkeiten
Open "C:\daten\demoresult.txt" For Output As #fc
For index = 1 To i2_col.count
Print #1, CStr(i2_col(index)) & " - " & CStr(i3_col(index)) & _
": " & CStr(freq(index))
Next index
Close #fc [I]alle Zahlen die auf i1 und i4 stehen - dürfen in keiner - egal welcher Zeile -
der demoresult.txt in i2 oder i3 vorkommen.[/I] - vermute ich jetzt mal ???
Beitrag wurde zuletzt am 24.01.13 um 07:30:54 editiert. | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: eierlein | Datum: 24.01.13 16:51 |
| Oder so:
Dim arr1(100) As String, arr2(100) As String
Dim arr3(100) As String, arr4(100) As String
Dim p As Long, p1 As Long, p2 As Long, i As Long
Dim i1$, i2$, i3$, i4$, t$
Open "jbl.txt" For Input As #1
While Not Eof(1)
i = i + 1
If UBound(arr1) < i Then
ReDim Preserve arr1(i + 100)
ReDim Preserve arr2(i + 100)
ReDim Preserve arr3(i + 100)
ReDim Preserve arr4(i + 100)
End If
Input #1, i1, i2, i3, i4
arr1(i) = Trim$(i1) : arr2(i) = Trim$(i2)
arr3(i) = Trim$(i3) : arr4(i) = Trim$(i4)
Wend
Close
For p = 1 To i
For p1 = 1 To i
If arr2(p) = arr1(p1) Or arr2(p) = arr4(p1) Or _
arr3(p) = arr1(p1) Or arr3(p) = arr1(p1) Then
arr2(p) = ""
Exit For
End If
Next
If Len(arr2(p)) Then arr2(p) = arr2(p) & " - " & arr3(p)
Next
Open "result.txt" For Output As #1
For p = 1 To i-1
p2 = 0 : t = ""
If Len(arr2(p)) Then
p2 = 1 : t = arr2(p)
End If
For p1 = p + 1 To i
If p2 = 0 Then Exit For
If arr2(p) = arr2(p1) Then
arr2(p1) = "" : p2 = p2 + 1
End If
Next
If p2 > 0 Then Print #1, t; " :"; Str$(p2)
Next
If Len(arr2(i)) Then Print #1, arr2(i); " : 1"
Close 0 | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: Manfred X | Datum: 24.01.13 18:03 |
| Hallo!
Bei Nutzung eines Array zum Lesen der Daten, würde ich
auf meinen Vorschlag von oben zurückkommen.
Der Datentyp:
Private Type Line_Input
i1 As Integer
i2 As Integer
i3 As Integer
i4 As Integer
End Type Die Leseroutine:
Private Function Readlines(ByVal filename, _
ByRef filedata() As Line_Input) As Boolean
On Error GoTo fehler
Dim line As String, values() As String
Dim fc As Integer, index As Integer
Readlines = False
ReDim filedata(100)
fc = FreeFile
Open filename For Input As #fc
While Not EOF(fc)
Line Input #fc, line
values() = Split(line, ",")
If Not UBound(values) = 3 Then Exit Function
index = index + 1
If UBound(filedata) = index Then
ReDim Preserve filedata(index + 100)
End If
With filedata(index)
.i1 = CInt(values(0))
.i2 = CInt(values(1))
.i3 = CInt(values(2))
.i4 = CInt(values(3))
End With
Wend
Close #fc
ReDim Preserve filedata(index)
Readlines = True
Exit Function
fehler:
End Function | |
Re: Kombi i2 i3 wie oft vorhanden? | | | Autor: JBL | Datum: 25.01.13 06:16 |
| hallo Manfred,
ja du hast richtig vermutet - dieser Ablauf stimmt - daumen hoch !!!
War aber bestimmt meine Schuld - schlecht erklärt.
Auch danke an "eierlein" für die Zeit und Mühe die ihr aufgewendet habt.
Ich schaue mir am Wochenende die genauen Ablauf nochmals an und gebe dann
hier Rückmeldung. Habe aber schon 1 x getestet und läuft - perfekt.
Vielen lieben Dank
LG
Angelina | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats sevGraph (VB/VBA)
Grafische Auswertungen
Präsentieren Sie Ihre Daten mit wenig Aufwand in grafischer Form. sevGraph unterstützt hierbei Balken-, Linien- und Stapel-Diagramme (Stacked Bars), sowie 2D- und 3D-Tortendiagramme und arbeitet vollständig datenbankunabhängig! Weitere Infos
|