(Solucionado) separar un string en varias cadenas (Split)

Iniciado por Eleкtro, 22 Noviembre 2012, 00:46 AM

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

Eleкtro

Hola,

En mi form, creo una variable que contiene un string, que más tarde usaré en un botón para lanzar una app externa con los argumentos que previamente estan guardados en mi variable.

El contenido de la variable es este:
Código (vbnet) [Seleccionar]
Winamp.exe "Argumento 1" "argumento 2" "argumento 3" "más argumentos"

PD: Los argumentos son rutas de carpetas.

Y lo que quisiera hacer es un split para obtener cada argumento, osea, cada carpeta que está encerrada en comillas,y hacer algo así:


' Pseudocode
For each folder in var.split(ControlChars.Quote)
   for each file in get.folder.files
    appendline.(archivo_de_Texto, file.Name)
 Next


¿Como puedo hacer ese split en VB?

EDITO:
He intentadoe sto, pero me dice que hay caracteres ilegales... :S

Código (vbnet) [Seleccionar]
           Dim entries = playerargs.Split(" "c)
           For n As Integer = 1 To entries.Length - 1
               Dim files As String() = Directory.GetFiles(entries(n))
           Next











Keyen Night

#1
Environment.GetCommandLineArgs, te entrega la lista de parámetros con la que fue llamada tu aplicación, ya ordenada, comenzando desde la ruta completa de tu ejecutable.
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Eleкtro

Gracias Keyen Night, pero no es lo que busco

me ha hecho gracia, porque eres la tercera víctima persona que por mi culpa se ha confundido con mi duda, ya la he editado/vuelto a plantear, sorry, ojalá puedas ayudarme con eso.








Keyen Night

#3
Eso se puede solucionar fácilmente con expresiones regulares, como es un tema extenso te regalo el código, con la condición de que investigues un poco es un tema interesante y muy útil :xD

Edito: Para modificar el error del espacio de la expresión regular.

Código (vb.net) [Seleccionar]

Imports System.Text.RegularExpressions

       Dim Expresión As String = String.Format("{0}[^{0}$]+{0}", Convert.ToChar(32))

       'Esta variable simula la que tu creas en tu aplicación'
       Dim Comando As String = String.Format("Comando.exe {0}C:\ejemplo{0} {0}C:\carpeta\ruta{0} {0}D:\archivos{0}", Convert.ToChar(32))

       For Each x As Match In Regex.Matches(Comando, Expresión)
           MessageBox.Show(x.Value)
       Next
La Fé Mueve Montañas...
                                    ...De Dinero

La programación es más que un trabajo es más que un hobby es una pasión...

Eleкtro

#4
Gracias otra vez Keyen, las expresiones regulares se usarlas (al menos en otros lenguajes), pero yo esto {0} nunca lo habia visro en un RegEx, y por más que busco información sobre que es... ni idea, y para colmo la usas al principio, la usas en medio (en una agrupación), y la vuelves a usar al final del regex, no he podido trabajar el patrón porque no sé que significa el {0} XD

Tu ejemplo me falla al encontrar un espacio en el string, he intentado añadirle (s) al patrón pero... como ya te digo con tanto {0} no sé por donde cojer la expresión.


Código (vbnet) [Seleccionar]
           Dim Expresión As String = String.Format("{0}[^{0}]+?{0}", Convert.ToChar(32))

           'Esta variable simula la que tu creas en tu aplicación'
           Dim Comando As String = String.Format(playerargs, Convert.ToChar(32))

           For Each x As Match In Regex.Matches(Comando, Expresión)
               MessageBox.Show(x.Value)
           Next

Si la variable contiene la cadena "C:\carpeta\con    espacios" el messagebox solo me muestra: "C:\Carpeta\Con, incluido la comilla, que tambien se la debería quitar... un rollo :xD






EDITO: Ya lo he solucionado:
Código (vbnet) [Seleccionar]
            Str = Replace(playerargs, " " & ControlChars.Quote, "")
            ' El contenido de Cadena queda así:    C:\Ruta 1"C:\Ruta 2"C:\Ruta 3"etc..."


He intentado hacer esto otro por mi cuenta, y me está dando mejores resultados...

El problema es que creo que en el array se guardan cadenas vacías,
si pudiera omitirlas con un "If NOTHING" me conformo, de hecho así es como las omito en este code, pero me sigue fallando una, solamente una... y no se como evitarla:

Código (vbnet) [Seleccionar]
           Dim Str As String
           ' Elimino los espacios entre argumentos
           Str = Replace(playerargs, " " & ControlChars.Quote, ControlChars.Quote)
           ' El contenido de Cadena queda así: "C:\Ruta 1""C:\Ruta 2""Más rutas..."

           ' El patrón delimitador (comilla)
           Dim Pattern As String = ControlChars.Quote

           Dim ArgsArray() As String 'Creamos un array

           ArgsArray = Split(Str, Pattern) 'Llenamos el array con las cadenas cortadas.

           ' Mostramos como ha quedado el resultado
           For Each folder In ArgsArray
               If Not folder = Nothing Then
                   Console.WriteLine(folder)
                   MessageBox.Show(folder)
               End If


           If randomize.Checked = True Then
               '  RandomiseFile("c:\1.txt")
           End If


primero me muestra una caja vacía:

(Es la cadena que quiero evitar, para la función que tengo que darle más tarde al array, que no quiero que me de error...)

y luego me muestra una caja de texto con cada "argumento", sin mostrarme ninguna otra caja vacía:










Novlucker

Los índices ({0}) no son de las expresiones regulares, son del string.format :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein