Arrat de String's

28/03/2005 - 01:18 por Angel | Informe spam
Hola amigos,

Mi problema es el siguiente:

Supongamos que me llega el siguiente string:

FMM/5
1/BR864/19MAR/LGW
BRU
121-42751741LGWBRU/T5K46MCO.12/NEWSPAPERS
121-73023521LGWBRU/T1K4MCO.05/ACFT INST
LAST

Tengo el siguiente código que me introduce en un array cada una de las
líneas.

Public Function Dividir_Mensaje(ByVal Mensaje As String, ByVal ParamArray
Delimitador() As Char) As String()
Return Mensaje.Split(Delimitador)

End Function

Ahora bien, de cada una de esas líneas tengo que separar por el delimitador
"/". Habia pensado en crearme un array que redimensionandolo guardara cada
una de las partes delimitadas por el caracter "/". El código que realice es
el siguiente:

Dim arrLineas() As String
Dim arrAux() As String
Dim arrCampos() As String
Dim i As Integer
Dim j As Integer
objValidaMensaje = New clsValidaMensaje(strServidor, strBaseDatos,
strConexion)

arrLineas = objValidaMensaje.Dividir_Mensaje(txtMensaje.Text, Chr(13))

For i = 0 To UBound(arrlineas)

arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")

For j = 0 To UBound(arrAux)

ReDim Preserve arrCampos(arrAux(i) + 1)

Next j

Next i

arrLineas = Nothing

arrAux = Nothing

El problema es que al realizar Redim Preserve me genera un error.

¿Es posible redimensionar un array de String? ¿Alguien tiene alguna idea
mejor de como realizarlo?

Acepto todas sus sugerencias.

Muchas gracias de antemano.

Preguntas similare

Leer las respuestas

#1 Leonardo Azpurua
28/03/2005 - 02:56 | Informe spam
"Angel" escribió en el mensaje
news:
Hola amigos,



Hola, Angel:

Mi problema es el siguiente:


[...]

Dim arrLineas() As String
Dim arrAux() As String
Dim arrCampos() As String


[...]
For i = 0 To UBound(arrlineas)
arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")
For j = 0 To UBound(arrAux)
ReDim Preserve arrCampos(arrAux(i) + 1)
Next j
Next i


[...]
arrLineas = Nothing
arrAux = Nothing



Estas dos lineas son prescindibles: al salir del procedimiento serán
"marcados para recolección", aunque no les asignes nothing.

El problema es que al realizar Redim Preserve me genera un error.

¿Es posible redimensionar un array de String? ¿Alguien tiene alguna idea
mejor de como realizarlo?



Si es posible redimensionar un array de string. Lo que no es posible es
utilizar como índice un valor de tipo string arbitrario (arrAux contiene los
Strings que obtuviste de la linea, arrAux(i) es el i-esimo string del
array). Tienes dos errores en tu código: el primero es el intento de sumarle
1 a un string; el segundo es el de utilizar un string como indice.

La manera correcta es esta:

For i = 0 To UBound(arrlineas)
arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")
For j = 0 To UBound(arrAux)
ReDim Preserve arrCampos(arrCampos.GetLength(0))
arrCampos(arrCampos.GetUpperBound(0)) = arrAux(j)
Next j
Next i

Si quieres simplificarte la vida (y ahorrarte las llamadas a GetLength y
GetUpperBound, y unas cuantas variables, puedes escribir:

Dim nCampos As Long = 0
For Each Linea As String In arrLineas
arrAux = objValidaMensaje.Dividir_Mensaje(s, "/")
For each aux As String in arrAux
ReDim Preserve arrCampos(nCampos)
arrCampos(nCampos) = aux
nCampos += 1
Next
Next

No se si sea más eficiente, pero te permite cambiar los vectores por
colecciones, o por listas, o por lo que mejor te parezca.

Otra recomendación es que en vez de usar
a = Split(s, "/")
escribas
a = s.Split("/").

además de ser más directa (la función Split es un "intermediario" que llama
al metodo Split de su argumento) el método Split de los String permite
utilizar un conjunto de separadores.

Salud!


Salud!
Respuesta Responder a este mensaje
#2 Eduardo A. Morcillo [MS MVP VB]
28/03/2005 - 03:30 | Informe spam
Otra recomendación es que en vez de usar
a = Split(s, "/")
escribas
a = s.Split("/").

además de ser más directa (la función Split es un "intermediario" que
llama al metodo Split de su argumento) el método Split de los String
permite utilizar un conjunto de separadores.



¿Entonces no seria mas simple asi? ¿O me estoy perdiendo de algo?

arrCampos = txtMensaje.Text.Split(Convert.ToChar(13), "/"c)

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
#3 Leonardo Azpurua
28/03/2005 - 07:35 | Informe spam
"Eduardo A. Morcillo [MS MVP VB]" <emorcillo .AT. mvps.org> escribió en el
mensaje news:%
¿Entonces no seria mas simple asi? ¿O me estoy perdiendo de algo?

arrCampos = txtMensaje.Text.Split(Convert.ToChar(13), "/"c)



Tengo la circutería de backtrack estropeada, y el caché de look ahead está
en reparación :-)

Salud!
Respuesta Responder a este mensaje
#4 Angel
28/03/2005 - 22:50 | Informe spam
Hola Leonardo,

Gracias por la ayuda, funciona perfecto.

Solo un pequeño matiz.

For i = 0 To UBound(arrlineas)
arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")
For j = 0 To UBound(arrAux)

arrCampos(arrCampos.GetUpperBound(0)) = arrAux(j)
ReDim Preserve arrCampos(arrCampos.GetLength(0))

Next j
Next i



Dentro del For cambio el orden de las sentencias para que el primer indice
del array no sea nulo o blanco, depues de asigarle un valor redimensiono el
array y vuelvo a asignarle valores.

Una cosa curiosa es que al final del arrCampos me crea 2 posiciones con
blanco o nulo. Una viene del array lineas, que la crea al realizar el split,
y la otra supongo que también la generara el split. No lo tengo muy claro,
pero lo observare.

Esta rutina no me ha quedado muy clara:

Dim nCampos As Long = 0
For Each Linea As String In arrLineas
arrAux = objValidaMensaje.Dividir_Mensaje(s, "/")
For each aux As String in arrAux
ReDim Preserve arrCampos(nCampos)
arrCampos(nCampos) = aux
nCampos += 1
Next
Next



Por eso me he decantado por utilizar la primera.

Con respecto a Eduardo:

arrCampos = txtMensaje.Text.Split(Convert.ToChar(13), "/"c)

Sencillamente maravilloso, en una sola línea realiza la separación de los
marcadores, pero en principio necesito saber que tiene cada línea, asi que
me toca declarar un par de array's.

Muchas gracias a los 2 por la ayuda.

Saludos.

"Leonardo Azpurua" <l e o n a r d o (arroba) m v p s (punto) o r g> escribió
en el mensaje news:#r#k8#

"Angel" escribió en el mensaje
news:
> Hola amigos,

Hola, Angel:

> Mi problema es el siguiente:
[...]

> Dim arrLineas() As String
> Dim arrAux() As String
> Dim arrCampos() As String
[...]
> For i = 0 To UBound(arrlineas)
> arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")
> For j = 0 To UBound(arrAux)
> ReDim Preserve arrCampos(arrAux(i) + 1)
> Next j
> Next i
[...]
> arrLineas = Nothing
> arrAux = Nothing

Estas dos lineas son prescindibles: al salir del procedimiento serán
"marcados para recolección", aunque no les asignes nothing.

> El problema es que al realizar Redim Preserve me genera un error.
>
> ¿Es posible redimensionar un array de String? ¿Alguien tiene alguna idea
> mejor de como realizarlo?

Si es posible redimensionar un array de string. Lo que no es posible es
utilizar como índice un valor de tipo string arbitrario (arrAux contiene


los
Strings que obtuviste de la linea, arrAux(i) es el i-esimo string del
array). Tienes dos errores en tu código: el primero es el intento de


sumarle
1 a un string; el segundo es el de utilizar un string como indice.

La manera correcta es esta:

For i = 0 To UBound(arrlineas)
arrAux = objValidaMensaje.Dividir_Mensaje(arrLineas(i), "/")
For j = 0 To UBound(arrAux)
ReDim Preserve arrCampos(arrCampos.GetLength(0))
arrCampos(arrCampos.GetUpperBound(0)) = arrAux(j)
Next j
Next i

Si quieres simplificarte la vida (y ahorrarte las llamadas a GetLength y
GetUpperBound, y unas cuantas variables, puedes escribir:

Dim nCampos As Long = 0
For Each Linea As String In arrLineas
arrAux = objValidaMensaje.Dividir_Mensaje(s, "/")
For each aux As String in arrAux
ReDim Preserve arrCampos(nCampos)
arrCampos(nCampos) = aux
nCampos += 1
Next
Next

No se si sea más eficiente, pero te permite cambiar los vectores por
colecciones, o por listas, o por lo que mejor te parezca.

Otra recomendación es que en vez de usar
a = Split(s, "/")
escribas
a = s.Split("/").

además de ser más directa (la función Split es un "intermediario" que


llama
al metodo Split de su argumento) el método Split de los String permite
utilizar un conjunto de separadores.

Salud!


Salud!


Respuesta Responder a este mensaje
#5 Eduardo A. Morcillo [MS MVP VB]
29/03/2005 - 05:34 | Informe spam
El codigo puede mejorarse un poco mas. Ya que un ReDim Preserve requiere
crear un nuevo array y copiar el contenido del viejo al nuevo conviene fijar
el tamaño del array al principio si el numero de campos es fijo. Si el
numero de campos es variable, entonces te conviene usar un ArrayList
inicializandolo con la cantidad promedio de campos que esperas (por defecto
inicia con espacio para 16 elementos). Si el ArrayList se queda sin espacio
crece automaticamente para aceptar mas elementos. Ademas, For Each es mas
lento que una indexacion con enteros. Por ejemplo:

Dim lineas() As String = txtMensaje.Text.Split(Convert.ToChar(13))
Dim campos As New System.Collections.ArrayList

For i As Integer = 0 To lineas.Length - 1
campos.AddRange(lineas(i).Split("/"c))
Next

Eduardo A. Morcillo [MS MVP VB]
http://www.mvps.org/emorcillo
https://mvp.support.microsoft.com/p...4EF5A4191C
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida