Kirjautuminen

Haku

Tehtävät

Koodit: VB6: Explode funktio VB:lle

Kirjoittaja: trinit

Kirjoitettu: 22.02.2003 – 22.02.2003

Tagit: teksti, koodi näytille, vinkki

Tämä funktio pilkkoo merkkijonon tietyllä erotinmerkillä taulukoksi ja palauttaa sen. Funktiota käytettäessä palautettavan taulukon kokoa ei tarvitse tietää etukäteen. Toiminta on rinnastettavissa PHP:n explode() funktioon pienin muutoksin tosin. Muutokset on kuvattu koodissa.

Public Function Explode(strSeparator As String, strString As String) As String()
' Funktio palauttaa merkkijonotaulukon, jonka solut täytetään niillä
' merkkijonoilla jotka löytyvät erotinmerkkien välistä.
'
' Tehnyt:     22.2.2003 - Tero Pietilä - http:/www.trinit.tk
' Päivitetty: 14.12.2003
'
' Päivityksen syy:
'   - Korjattu funktion toimintaa sellaisten erotinmerkkien osalta
'     jotka ovat pidempiä kuin yksimerkkisiä
'
' Parametrit:
'
'   strSeparator (String)
'
'           Erotinmerkki, jonka perusteella funktio pilkkoo
'           merkkijonon taulukoksi
'
'   strString    (String)
'
'           Merkkijono, josta etsitään erotinmerkkejä ja
'           josta luetaan taulukkoon asetettavat merkkijonot
'
' Poikkeukset funktion toiminnassa:
'
'   - Jos strSeparator on tyhjä palautetaan yksisoluinen taulukko
'     ja solu 0:an asetetaan merkkijono strString
'
'   - Jos strString on tyhjä palautetaan yksisoluinen taulukko
'     ja solu 0:an asetetaan tyhjä merkkijono
'--------------------------------------------------------------------

   Dim SeparatorCount As Integer
   Dim TempArray() As String


   ' Jos erotinmerkkiä ei ole annettu
   If strSeparator = "" Then
       ReDim TempArray(0) As String

       TempArray(0) = strString
       Explode = TempArray

       Exit Function
   End If

   ' Jos merkkijonoa ei ole annettu
   If strString = "" Then
       ReDim TempArray(0) As String

       TempArray(0) = ""
       Explode = TempArray

       Exit Function
   End If

   ' Lasketaan kuinka monta erotinmerkkiä
   ' merkkijonosta löytyy

   SeparatorCount = -1

   For i = 1 To Len(strString)
       If Mid$(strString, i, Len(strSeparator)) = strSeparator Then SeparatorCount = SeparatorCount + 1
   Next

   ' Jos erotinmerkkejä ei löytynyt, palautetaan strString
   ' merkkijono taulukon ensimmäisessä solussa (0)
   If SeparatorCount = -1 Then
       ReDim TempArray(0) As String

       TempArray(0) = strString
       Explode = TempArray

       Exit Function
   End If

   ' Erotinmerkkejä löytyi. Otetaan muistiin erotinmerkkien
   ' sijainnit merkkijonossa
   ReDim Positions(SeparatorCount) As Integer

   ' Ensimmäisen erotinmerkin sijainti
   Positions(0) = InStr(1, strString, strSeparator)

   ' Loput erotimerkit
   For i = 1 To SeparatorCount
       Positions(i) = InStr(Positions(i - 1) + 1, strString, strSeparator)
   Next

   ' Alustetaan väliaikainen taulukko joka lopuksi
   ' palautetaan funktion paluuarvona
   ReDim TempArray(SeparatorCount + 1) As String

   ' Ensimmäinen merkkijono
   TempArray(0) = Mid$(strString, 1, Positions(0) - 1)

   ' Loput merkkijonot SeparatorCount asti
   For i = 1 To SeparatorCount
       TempArray(i) = Mid$(strString, Positions(i - 1) + 1, Positions(i) - Positions(i - 1) - 1)
   Next

   ' Viimeinen merkkijono
   TempArray(SeparatorCount + 1) = Mid$(strString, Positions(SeparatorCount) + Len(strSeparator) + 1, Len(strString) - Positions(SeparatorCount))

   Explode = TempArray

End Function

Funkiota käytetään esim. näin:

Dim mjono As String
Dim taulu() As String

mjono = "Tässä on jotain tekstiä jolla voi testata explode funktion toimintaa"

taulu = Explode("x", mjono)

MsgBox "LBound: " & LBound(taulu) & " ja UBound: " & UBound(taulu)

For i = LBound(taulu) To UBound(taulu)
    MsgBox i & ": " & taulu(i)
Next

Kommentit

trinit [22.02.2003 22:01:39]

#

Funktion käyttöesimerkissä rivi: joku = Explode("x", mjono) pitäisi tietenkin olla

taulu = Explode("x", mjono)

Muokkaustoiminto koodivinkkeihin olisi mukava lisä ;)

thefox [22.02.2003 22:12:01]

#

VB:ssä on muuten Split-funktio, esim:
Dim foo As Variant
foo = Split(bar, "|")
Ja UBound(foo):lla selviää montako solua taulukossa on jne.. :)

trinit [22.02.2003 22:15:57]

#

Joo, huomasin itsekin sen vasta nyt... :)

thefox [22.02.2003 22:22:22]

#

Ja itse huomasin nyt että Laaksonen olikin jo tuon maininnut keskustelun puolella.

trinit [27.02.2003 10:24:58]

#

Nyt on korjattu käyttöesimerkin koodissa ollut kirjoitusvirhe josta mainitsin ensimmäisessä kommentissa.

henkka [04.11.2003 09:47:31]

#

Kiitoksia hyvästä vinkistä, sillä VB:n viitosversiossa ei ole Split-funktiota.

trinit [13.12.2003 22:17:31]

#

Hahaa, huomasin ettei tämä toimikaan sellaisella erotinmerkillä jossa on enemmänkuin yksi merkki. Eli esim. jos erotinmerkki on = -merkki ongelmia ei ole, mutta jos se onkin == niin funktio luulee ettei erotinmerkkejä ole ja palauttaa koko merkkijonon.

Korjaus tulossa tänne kun sen saan tehtyä ensin omaan ohjelmaani.

trinit [14.12.2003 19:52:47]

#

Funktio korjattu tänään ja nyt sen pitäisi toimia oikein.

tti8sveliv [14.05.2004 10:29:22]

#

Kokeilin tuota koodia, mutta viimeisen tiedon ensimmäinen merkki häviää. Hmmm...

Esim..

siirto.AddRows "¤", "Arvo 1¤Arvo 2¤Arvo 3¤Arvo 4¤Arvo 5¤Arvo 6"

Public Function AddRows(sErotin_ As String, sArvot_ As String) As Boolean
    tmpTaulu = Explode(sErotin_, sArvot_)
    For i = LBound(tmpTaulu) To UBound(tmpTaulu)
        Set rw = New clsRow
        rw.Arvo = tmpTaulu(i)
        colInputRows.Add rw
    Next
End Function

tti8sveliv [14.05.2004 10:46:16]

#

Virhe löytyi. Poistin toiseksi viimeiseltä riviltä Mid:n aloitus merkin parametrista "+1" arvon. Nyt toimii..

TempArray(SeparatorCount + 1) = Mid$(strString, Positions(SeparatorCount) + Len(strSeparator), Len(strString) - Positions(SeparatorCount))

Kirjoita kommentti

Muista lukea kirjoitusohjeet.
Tietoa sivustosta