[SOURCE] MultiSplit7913 Un split diferente XD

Iniciado por 79137913, 14 Marzo 2011, 15:20 PM

0 Miembros y 1 Visitante están viendo este tema.

79137913

HOLA!!!

Hoy queria hacer un split que devuelva un array con varios delimitadores y aparte tenga la opcion de guardar el delimitador... en fin... hice esta funcion, espero que les sirva.

Antes que el codigo Ejemplo:

Código (vb) [Seleccionar]
Private Sub Ejemplo()
Dim dels(3) As String
Dim result() As String
Const ss As String = "hola+como--andas(((esto====es+una--prueba"
   dels(0) = "+"
   dels(1) = "--"
   dels(2) = "((("
   dels(3) = "===="
   
   'sin preservar delimitadores
   result = MultiSplit7913(ss, dels, False)
   'result = ("hola";"como";"andas";"esto";"es";"una";"prueba")
   
   'preservando delimitadores
   result = MultiSplit7913(ss, dels, True)
   'result = ("hola";"+como";"--andas";"(((esto";"====es";"+una";"--prueba")
End Sub


El Codigo

Código (vb) [Seleccionar]
Private Function MultiSplit7913(expression As String, Delimiter() As String, PreserveDel As Boolean) As String()
Dim DelCount    As Long
Dim lExp        As Long
Dim X           As Long
Dim Pos         As Long
Dim DelPos()    As Long
Dim AuxArr()    As String
Dim LastPos     As Long
Dim LastLen     As Long
Dim LastInstr   As Long

    expression = expression & Delimiter(0)
    lExp = Len(expression)
    DelCount = UBound(Delimiter)
    ReDim DelPos(lExp)
     
    For X = 0 To DelCount
        Pos = 1
        LastInstr = InStr(Pos, expression, Delimiter(X))
        Do While LastInstr <> 0
            DelPos(LastInstr) = X + 1
            Pos = LastInstr + Len(Delimiter(X)) + Pos
            LastInstr = InStr(Pos, expression, Delimiter(X))
        Loop
    Next
   
    ReDim AuxArr(0)
   
    LastPos = 1
     
    For X = 0 To lExp
        If DelPos(X) <> 0 Then
            ReDim Preserve AuxArr(UBound(AuxArr) + 1)
            If PreserveDel Then
                AuxArr(UBound(AuxArr) - 1) = Mid$(expression, LastPos, X - LastPos)
            Else
                AuxArr(UBound(AuxArr) - 1) = Mid$(expression, LastPos + LastLen, X - LastPos - LastLen)
                LastLen = Len(Delimiter(DelPos(X) - 1))
            End If
            LastPos = X
        End If
    Next
     
    ReDim Preserve AuxArr(UBound(AuxArr) - 1)
     
    MultiSplit7913 = AuxArr

End Function


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Funciona, pero lo podrias mejorar ;)

Aqui te van unos ejemplos :)


  • Podrias ahorrarte las 3 llamadas a InStr guardandolas en una sola variable :xD
  • En lugar de guardar las posiciones con un flag, guarda en un array las posiciones de los delimitadores, asi despues evitas volver a recorrer la cadena (segundo for) y solo recorres el array y haces un mid, ya que tienes la posicion en el arreglo

Por lo demas, Esta buena la idea :)

79137913

#2
HOLA!!!

Mmm, en cuanto al punto 1 si, lo voy a cambiar.

En cuanto al punto 2... En ese array que decis, ademas de la posicion del delimitador debo guardar el delimitador (osea delimitador(0) en posicion 3) eso me obliga a usar 2 vectores o una matriz, al usar una matriz tendria que saltar los espacios blancos que hay, pero si uso 2 vectores uno para la posicion y otro para el delimitador mmm... podria ser voy a probar.

Me dio fiaca hacer el punto 2 XD

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Puedes crear un tipo "marcador" con dos long, uno que indique el index del separador y otro que diga el index del char donde empieza, y asi sigues teniendo un solo arreglo :P

79137913

HOLA!!!

Si, hice eso cuando lo estapa haciendo, pero al usar instr por cada delimitador el vector estaria desordenado y ordenarlo es un bajon... la otra forma que tendria es con mid, pero seria mas lento.

GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Pero... si ya estas insertando ordenadamente :|

79137913

HOLA!!!

No, Fijate que se hace un recorrido(hecho de instr en el while) por cada Delimitador, entonces si en el lugar 3 y 10 esta el delimitador 1 y en el lugar 7 esta el delimitador 2 el vector quedara asi:


Pos.index(3,10,7)
Pos.Delimit(1,1,2)


GRACIAS POR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*

raul338

Me entendiste mal :xD
yo me referia asi

Private Type Separador
    index    As Long
    delimit   As Long
End Type

posicion 1
   .index = 3
   .Delimit = 1
posicion 2
   .index = 10
   .delimit = 2
posicion 3
   .index = 7
   .delimit = 1


:P te dije, usando un solo vector :P

Psyke1

Esa fue una de las formas que pensé yo!! :D

DoEvents! :P

79137913

#9
HOLA!!!

Si, en un vector, lo entiendo, pero lo que te decia era que es un bajon ordenarlo.

GRACIASPOR LEER!!!
"Como no se puede igualar a Dios, ya he decidido que hacer, ¡SUPERARLO!"
"La peor de las ignorancias es no saber corregirlas"

79137913                          *Shadow Scouts Team*