Título: [SOLUCIONADO] Split
Publicado por: Miseryk en 19 Julio 2013, 09:28 am
Hola, estaba tratando de hacer algo mientras me topé con un problema, tal vez parezca tonto o quizá nunca necesité algo así. Lo que quiero lograr, es encontrar la posición con respecto a un index de un Split. Code: Form: Option Explicit Private Sub Form_Load() Call ConfigArray Call Stuff End End Sub
Module: Option Explicit Public MyByteArray() As Byte Public Const StrByteArray As String = "255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,250,0,0,0,0,0,0," & _ "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0," & _ "0,0,3,4,248,3,0,247,246,5,6,2,245,244,5,6,243,242,7,241,8,240,9,10,239,9,11,12,8,238,11," & _ "13,13,10,237,8,236,14,8,9,235,13,8,7,13,8,7,234,233,8,12,10,232,14,231,15,15,230,229,0,0,0," & _ "0,0,0,0,228,227,226,16,5,2,17,18,5,2,17,18,5,2,17,18,225,224,4,18,223,2,17,18,222,19,18," & _ "18,20,2,17,18,21,22,221,18,220,2,17,18,21,22,219,18,23,2,17,18,5,2,218,18,16,2,17,18,21,22," & _ "217,18,19,2,17,18,21,22,216,218,23,2,17,18,21,22,215,18,20,2,17" Public MaxArray As Integer Public Sub ConfigArray() Dim i As Integer MaxArray = UBound(Split(StrByteArray, ",")) ReDim MyByteArray(0 To MaxArray) As Byte For i = 0 To MaxArray MyByteArray(i) = Split(StrByteArray, ",")(i) Next i End Sub Public Sub Stuff() Dim i As Integer Dim CurrentByte As Byte Dim found As Long Dim CurrentPos As Long For i = 0 To MaxArray If i = 5 Then 'Ejemplo, index 5 -> 255,254,253,0,252,0, CurrentByte = MyByteArray(i) CurrentPos = Aca quiero obtener la posicion del index 5 End If Next i End Sub
CurrentPos = Aca quiero obtener la posicion del index 5, que sería 19 Alguna idea o algún comando mágico que me retorne la posición según el index?
Título: Re: [AYUDA] Split
Publicado por: raul338 en 19 Julio 2013, 14:48 pm
No entiendo de que queres la posicion: La posición en el string del valor que esta en el array (index 1, pos 1; index 2, pos 4; index 3, pos 8; index 4, pos 12; index 5, pos 13...) Si es así deberias sumar el length del string de cada uno de los items del array que vas recorriendo + el contador (la cantidad de separadores que pasaste)
Otra cosa, ConfigArray se puede optimizar mucho! Trata de usar una sola vez Split y trabaja con el array devuelto, ese for con el split adentro tarda mucho porque tiene hacer tantas veces split una y otra vez cuando ya lo hizo antes para obtener el ubound! Ademas de que estas duplicando el array que te devuelve el split
Título: Re: [AYUDA] Split
Publicado por: Miseryk en 19 Julio 2013, 20:43 pm
Muy cierto, no me había dado cuenta. Muchas gracias, de lo la longitud lo pude hacer, pero de otra manera a la que quería. Option Explicit Private Sub Form_Load() Call ConfigArray Call Stuff End End Sub
Option Explicit Public MyByteArray() As Byte Public Const StrByteArray As String = "255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,250,0,0,0,0,0,0," & _ "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0," & _ "0,0,3,4,248,3,0,247,246,5,6,2,245,244,5,6,243,242,7,241,8,240,9,10,239,9,11,12,8,238,11," & _ "13,13,10,237,8,236,14,8,9,235,13,8,7,13,8,7,234,233,8,12,10,232,14,231,15,15,230,229,0,0,0," & _ "0,0,0,0,228,227,226,16,5,2,17,18,5,2,17,18,5,2,17,18,225,224,4,18,223,2,17,18,222,19,18," & _ "18,20,2,17,18,21,22,221,18,220,2,17,18,21,22,219,18,23,2,17,18,5,2,218,18,16,2,17,18,21,22," & _ "217,18,19,2,17,18,21,22,216,218,23,2,17,18,21,22,215,18,20,2,17" Public MaxArray As Integer Public colObject As New Collection Public Sub ConfigArray() Dim i As Integer Dim pos As Double Dim newpos As Double Dim SplitOneTime As Variant SplitOneTime = Split(StrByteArray, ",") MaxArray = UBound(SplitOneTime) ReDim MyByteArray(0 To MaxArray) As Byte pos = 1 For i = 0 To MaxArray MyByteArray(i) = SplitOneTime(i) If i = 0 Then colObject.Add Array((i + 1), CStr(1)) Else newpos = InStr(pos, StrByteArray, ",") + 1 colObject.Add Array((i + 1), CStr(newpos)) pos = newpos End If Next i End Sub Public Sub Stuff() Dim i As Integer Dim CurrentByte As Byte Dim found As Double Dim CurrentPos As Double Dim NextPos As Double Dim FirstPattern As String Dim SecondPattern As String For i = 0 To MaxArray 'Ejemplo, index 5 -> 255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0 CurrentByte = MyByteArray(i) If i = 103 Then Stop CurrentPos = colObject(i + 1)(1) NextPos = colObject(i + 2)(1) found = InStr(NextPos, StrByteArray, CurrentByte) FirstPattern = Mid(StrByteArray, CurrentPos, found - CurrentPos) '= "13,8,7," SecondPattern = Mid(StrByteArray, found, found - CurrentPos) '= "13,8,7," MsgBox StrComp(FirstPattern, SecondPattern) = 0 End If Next i End Sub
Ahí obtuve el CurrentPos y el NextPos que quería para encontrar coincidencias con mid y found. PD: pero no es lo que quería, no quería usar Public colObject As New Collection
para obtener las posiciones en mid para el index del array o del split.
Título: Re: [AYUDA] Split
Publicado por: DarkMatrix en 20 Julio 2013, 03:10 am
Y asi: Option Explicit Public MyBytePos() As Long Public MyByteArray() As Byte Public Const StrByteArray As String = "255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,250,0,0,0,0,0,0," & _ "0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0," & _ "0,0,3,4,248,3,0,247,246,5,6,2,245,244,5,6,243,242,7,241,8,240,9,10,239,9,11,12,8,238,11," & _ "13,13,10,237,8,236,14,8,9,235,13,8,7,13,8,7,234,233,8,12,10,232,14,231,15,15,230,229,0,0,0," & _ "0,0,0,0,228,227,226,16,5,2,17,18,5,2,17,18,5,2,17,18,225,224,4,18,223,2,17,18,222,19,18," & _ "18,20,2,17,18,21,22,221,18,220,2,17,18,21,22,219,18,23,2,17,18,5,2,218,18,16,2,17,18,21,22," & _ "217,18,19,2,17,18,21,22,216,218,23,2,17,18,21,22,215,18,20,2,17" Public MaxArray As Integer Public Sub ConfigArray() Dim I As Integer Dim Pos As Double Dim NewPos As Double Dim SplitOneTime() As String SplitOneTime = Split(StrByteArray, ",") MaxArray = UBound(SplitOneTime) ReDim MyBytePos(0 To MaxArray) ReDim MyByteArray(0 To MaxArray) Pos = 1 For I = 0 To MaxArray MyByteArray(I) = CByte(SplitOneTime(I)) If I = 0 Then MyBytePos(I) = 1 Else MyBytePos(I) = (MyBytePos(I - 1) + Len(SplitOneTime(I - 1))) + 1 End If Next I 'MsgBox MyBytePos(5) ' = 19 'MsgBox MyBytePos(40) ' = 93 End Sub Public Sub Stuff() Dim I As Integer Dim CurrentByte As Byte Dim found As Double Dim CurrentPos As Double Dim NextPos As Double Dim FirstPattern As String Dim SecondPattern As String For I = 0 To MaxArray 'Ejemplo, index 5 -> 255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0 CurrentByte = MyByteArray(I) If I = 103 Then Stop CurrentPos = MyBytePos(I) NextPos = MyBytePos(I + 1) found = InStr(NextPos, StrByteArray, CurrentByte) FirstPattern = Mid(StrByteArray, CurrentPos, found - CurrentPos) '= "13,8,7," SecondPattern = Mid(StrByteArray, found, found - CurrentPos) '= "13,8,7," MsgBox StrComp(FirstPattern, SecondPattern) = 0 End If Next I End Sub
Título: Re: [AYUDA] Split
Publicado por: Miseryk en 20 Julio 2013, 04:15 am
También, pero andaba buscando algún método o algo del split SplitOneTime = Split(StrByteArray, ",")
con el cual pueda obtener esa pocisión sin tener que declarar otra varible ya sea array o collección.
Título: Re: [AYUDA] Split
Publicado por: Miseryk en 20 Julio 2013, 15:51 pm
Aunque no sea la respuesta que quiero, me ayuda a resolver mi problema, es por éso que lo pongo como SOLUCIONADO y no como RESUELTO, si quieren aportar nuevas cosas, bienvenidos sean :D
Gracias a todos.
Título: Re: [SOLUCIONADO] Split
Publicado por: BlackZeroX en 21 Julio 2013, 09:38 am
Esto es mas fácil que un split... y te olvidas de convertir de string a byte o integer dim MyBytePos() as Byte ' Si los numeros en el Array son mayors usa Integer en lugar de byte y si son mayores usa long y si no pss Double.... MyBytePos = Array(255,254,253,0,252,0,0,0,251,0,0,0,1,1,0,0,0,0,0,0,0,0,0,0,250,0,0,0,0,0,0, _ 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,249,0, _ 0,0,3,4,248,3,0,247,246,5,6,2,245,244,5,6,243,242,7,241,8,240,9,10,239,9,11,12,8,238,11, _ 13,13,10,237,8,236,14,8,9,235,13,8,7,13,8,7,234,233,8,12,10,232,14,231,15,15,230,229,0,0,0, _ 0,0,0,0,228,227,226,16,5,2,17,18,5,2,17,18,5,2,17,18,225,224,4,18,223,2,17,18,222,19,18, _ 18,20,2,17,18,21,22,221,18,220,2,17,18,21,22,219,18,23,2,17,18,5,2,218,18,16,2,17,18,21,22, _ 217,18,19,2,17,18,21,22,216,218,23,2,17,18,21,22,215,18,20,2,17) debug.print chr(34) & Join(days(), ",") & chr(34) ' Esta linea la puedes quitar sin problemas debug.print "Posicion Numero 0:"; MyBytePos(0) debug.print "Posicion Numero 5:"; MyBytePos(5)
Dulces Lunas!¡.
|