Avatar billede jps2mt Nybegynder
06. februar 2003 - 19:53 Der er 18 kommentarer og
1 løsning

Tæl hvor mange poster med samme IP i ListView

Jeg har et listview i mit projekt, hvortil jeg tilføjer log-data fra min router...

Jeg har nu brug for at få talt sammen hvor mange gange hver IP går igen...

Hvordan kan jeg klare dette??
Avatar billede martin_moth Mester
07. februar 2003 - 12:00 #1
En måde at gøre det på:

1. Kik på første listitem, og smit det evt. i et array
2. Loop over de efterfølgende listitems, og tæl en op hver gang der findes et magen til første listitem.

Herefter kører du følgende loop, indtil sidste item nås:

3. Kit på næste listitem, der ikke findes i dit array. Smid det i arrayet, og loop over alle de resterende elementer. tæl en op for hver du møder et item magen til det du lige har smidt i arrayet

PS: Du er altså nødt til at have to tællere, en der tæller det aktuelle item, og inden i den løkke en anden løkke, en der tæller over de resterende items :o)

Det kan være helt sjov at lave sådanne løkker (synes jeg;o), så held og lykke...

/Martin
Avatar billede jps2mt Nybegynder
07. februar 2003 - 16:33 #2
Ser du...Det fattede jeg ikke en brik af...Sorry...
Har aldrig rigtigt haft brug for arrays i mine programmer, så har ikke så pokkers meget forstand på sådanne...
Avatar billede martin_moth Mester
07. februar 2003 - 16:53 #3
Så lad være med at gem det i et array - gem det i et antal variabler i stedet for, hvis du hellere vil det
Avatar billede jps2mt Nybegynder
07. februar 2003 - 18:24 #4
Kan du ikke smide et eksempel...Synes slet ikke jeg kan gennemskue din ide...
Avatar billede martin_moth Mester
07. februar 2003 - 20:27 #5
Avatar billede martin_moth Mester
07. februar 2003 - 20:33 #6
Ved du hvordan man laver en løkke?
Avatar billede jps2mt Nybegynder
07. februar 2003 - 21:51 #7
Det link...Hvad skulle jeg med det?? Jeg ved udemærket hvordan man programmerer, og har gjort det i snart 10 år...

Jeg kan bare ikke gennemskue din ide, derfor er jeg interesseret i et lille eksempel...Det behøver slet ikke at have noget med min kode at gøre...Bare et eksempel på hvordan man laver sådan noget...

Jeg kan nemlig ikke se hvordan den skulle kunne holde styr på hvilke IP'ere der optræder flest gange...
Avatar billede martin_moth Mester
08. februar 2003 - 12:07 #8
"Jeg ved udemærket hvordan man programmerer, og har gjort det i snart 10 år..."

harmonerer ikke så godt med

  "Har aldrig rigtigt haft brug for arrays i mine programmer, så har ikke så pokkers meget forstand på sådanne..."

Kan man have programmeret meget mere end end en eftermiddag uden at kunne bruge et array?

Nå, kommer med en løsning senere i dag - skal i biffen :o)
Avatar billede jps2mt Nybegynder
08. februar 2003 - 12:27 #9
SAGTENS...Men siden du behandler folk sådan, så behøver du ikke spilde din tid på mig...Kan finde hjælp andetsteds så...
Avatar billede martin_moth Mester
08. februar 2003 - 12:47 #10
Øhh - til at starte med kunne jeg ikke vide at du havde programmeret i 10 år eller 10 minutter (ofte stilles der spørgsmål af folk, der slet ikke kender nget til VB på forhånd). Og når du så siger, at du ikke kender til arrays, tænkte jeg straks, et du var newbii - derfor et link til en tuturial. Desuden tjekker jeg mig, at du kender til løkker, da de jo også er helt centrale og nødvendige for min løsning.

Herefter får jeg at vide at du har programmeret i ti år, og jeg tillader at undre mig over, at du så ikke kender til arrays. Det er jo noget af det allermest centrale, og i mine øjne helt uundgåeligt at komme til at bruge...

Jeg har en løsning fiks og færdig, der dog er lavet med et dynamsik array - interesseret?

"siden du behandler folk sådan..." - jeg tror du opfatter tonen i mine svar helt forkert!!!
Avatar billede jps2mt Nybegynder
08. februar 2003 - 18:44 #11
Hmm...Måske jeg har...

Blot fordi ikke alle programmerer på samme måde som du måske gør, betyder jo ikke at de er helt grønne...

At jeg ikke har haft behov for arrays endnu (andet end til split funktionen) betyder jo ikke at jeg ikke har en disse forstand på programmering...Dog lægger jeg det meste af min programmeringstid i PHP-scripts...

Men lad mig se om det er noget jeg kan bruge, og viser det sig brugbart, skal du selvfølgelig nok få dine points...
Avatar billede martin_moth Mester
10. februar 2003 - 09:08 #12
Har løsningen derhjemme - poster den i aften
Avatar billede martin_moth Mester
10. februar 2003 - 18:14 #13
OK - her er en løsning. Jeg vil foreslå at du opretter et nyt VB-projekt, følger vejledningen, og når du ser hvordan det fungerer, så kopierer det du kan bruge til dit eget projekt:

Opret en form, hvorpå du smider 2 listboxe (List1 og List2) samt en knap (Command1). Opret desuden et modul.



I modulet skriver du:

  Option Explicit

  Public Type IPnummer
    IP As String
    Antal As Integer
  End Type



I Formens kodevindue skriver du:


Dim i As Integer
Dim j As Integer
Dim k As Integer
Dim MitArray() As IPnummer

Private Sub Form_Load()
'Smider demo-data i list1. Disse svarer til IP-numrene
  List1.AddItem "Jeg er her 4 gange"
  List1.AddItem "Jeg er her 1 gange"
  List1.AddItem "Jeg er her 4 gange"
  List1.AddItem "Jeg er her 4 gange"
  List1.AddItem "Jeg er her 2 gange"
  List1.AddItem "Jeg er her 4 gange"
  List1.AddItem "Jeg er her 2 gange"
End Sub

Private Function FindesIArray(ByVal p_i As Integer) As Boolean
'Undersøger, om et listitem allerede findes i MitArray
  Dim local_i
  FindesIArray = False
  For local_i = LBound(MitArray) To UBound(MitArray)
    If MitArray(local_i).IP = List1.List(p_i) Then
      FindesIArray = True
      Exit Function
    End If
  Next local_i
End Function

Private Sub Command1_Click()
'Tæller ens forekomster i List 1 og gemmer resultaterne i MitArray
  k = -1
  ReDim MitArray(0)
  For i = 0 To List1.ListCount - 1
    If Not FindesIArray(i) Then
      k = k + 1
      ReDim Preserve MitArray(k)
      MitArray(k).IP = List1.List(i)
      MitArray(k).Antal = 1
      For j = 1 + i To List1.ListCount - 1
        If List1.List(i) = List1.List(j) Then
          MitArray(k).Antal = MitArray(k).Antal + 1
        End If
      Next j
    End If
  Next i

'Skriver resultaterne til List2
  For j = 0 To k
    List2.AddItem "'" & MitArray(j).IP & "' optræder " & MitArray(j).Antal & " gange"
  Next j

End Sub



Prøv at kør programmet - og skift evt. indholdet af List1. Hurra - det virker!!!

Helt almindelig kode, med 3 løkker inden i hinanden. Der er naturligvis 117 andre måder at gøre det på, og du kan også gøre det uden brug af selvdefinerede typer (IPnummer) og uden brug af arrays. Jeg gør i min løsning brug af en selvdefineret type (IPnummer) samt et dynamisk array (der bliver redimensioneret adskellige gange), da jeg synes det er det mest elegante måde. Jeg kan godt skrive det om, hvis du stadig ikke kan lide arrays ;o)

Får jeg de 30p nu? ;o)
Avatar billede jps2mt Nybegynder
10. februar 2003 - 20:09 #14
Det ser skide godt ud, og dit eksempel virker efter hensigten...

Men når jeg prøvet at få flettet mit eget program ind, med listview'et i stedet for listbox'en, så kommer koden til at se sådan her ud:

Public Function countIP(ByVal theType As String)
'Tæller ens forekomster i lstLog og gemmer resultaterne i MitArray
If theType = "source" Then
  'tæller source IP
  k = -1
  ReDim MitArray(0)
  For i = 0 To frmMain.lstLog.ListItems.Count - 1
  Debug.Print i
  If Not FindesIArray(i) Then
    k = k + 1
    ReDim Preserve MitArray(k)
    MitArray(k).IP = frmMain.lstLog.ListItems(i).SubItems(4)
    MitArray(k).Antal = 1
    For j = 1 + i To frmMain.lstLog.ListItems.Count - 1
    If frmMain.lstLog.ListItems(i).SubItems(4) = frmMain.lstLog.ListItems(j).SubItems(4) Then
      MitArray(k).Antal = MitArray(k).Antal + 1
    End If
    Next j
  End If
  Next i
 
  For j = 0 To k
  Debug.Print "'" & MitArray(j).IP & "' optræder " & MitArray(j).Antal & " gange"
  Next j
ElseIf theType = "destination" Then
  'tæller destination IP
End If
End Function


Private Function FindesIArray(ByVal p_i As Integer) As Boolean
'Undersøger, om et listitem allerede findes i MitArray
  Dim local_i
  FindesIArray = False
  For local_i = LBound(MitArray) To UBound(MitArray)
    Debug.Print "local_i - " & local_i & " & p_i - " & p_i
    If MitArray(local_i).IP = frmMain.lstLog.ListItems(p_i).SubItems(4) Then
      FindesIArray = True
      Exit Function
    End If
  Next local_i
End Function

Men det virker ikke...Den bliver ved med at komme med fejlen "Index out of bounds" på FindesIArray funktionen...
Avatar billede martin_moth Mester
10. februar 2003 - 20:19 #15
hmm - i hvilken linie?

Jeg har jo en list1 og en list2 samt et array der alle starter med index 0 som første index - måske starter dun lstLog med index 1, og fejler når der forsøges med index 0?

Altså - hvilket index er der tale om, hvilken værdi har det når det fejler, og hvor fejler det -. i arrayet, i listItems eller?
Avatar billede jps2mt Nybegynder
10. februar 2003 - 20:59 #16
i - 0
local_i - 0 & p_i - 0

Linien den fejler i er denne:

If MitArray(local_i).IP = frmMain.lstLog.ListItems(p_i).SubItems(4) Then

Og umiddelbart ser det faktisk ud til at listview'et starter med index 1 og ikke 0
Avatar billede martin_moth Mester
10. februar 2003 - 21:37 #17
Så har du jo fejlen!
For at være 100% sikker, kan du jo forsøge andetsteds at kalde din lstLog.Listi... med index 0, og se om du får en fejl.

Med din programmeringserfaring kan du sikkert finde ud af at forøge p_i med een for at undgå fejlen (he he) ;o)
Avatar billede jps2mt Nybegynder
10. februar 2003 - 21:46 #18
Hmmm...Har fået den til at "glemme" den fejl ;) men den bliver ved med at sige at alle IP'ere er fundet 1 gang, selvom den måske står der 100 gange...

Desuden skulle jeg lige hilse og sige at den er MEGET længe om at løbe et par tusinde liners log igennem...

Men har en ide om at den nok skal tjekke og tælle ved hver ny linie der bliver skrevet, så den ikke skal løbe det hele igennem hver gang... :)

Men igen...Den kan kun finde ud af at tælle til 1... :)
Avatar billede jps2mt Nybegynder
10. februar 2003 - 22:37 #19
Så fik jeg det til at virke, ca. som jeg havde forestillet mig...Måtte selvfølgelig lave en del om i den kode du foreslog, men det var jo kun et eksempel...

Har tilladt mig at give dig en dobbelt op da jeg synes du har fortjent det, og som et plaster på såret, vedr. mit sure opstød :)

http://www.eksperten.dk/spm/315912

Mvh. og mange tak, Morten
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester