Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Eleкtro en 22 Noviembre 2012, 00:46 am



Título: (Solucionado) separar un string en varias cadenas (Split)
Publicado por: Eleкtro en 22 Noviembre 2012, 00:46 am
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
  1. 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í:

Código:
' 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
  1.            Dim entries = playerargs.Split(" "c)
  2.            For n As Integer = 1 To entries.Length - 1
  3.                Dim files As String() = Directory.GetFiles(entries(n))
  4.            Next




Título: Re: separar un string en varias cadenas (Split)
Publicado por: Keyen Night en 22 Noviembre 2012, 01:15 am
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.


Título: Re: separar un string en varias cadenas (Split)
Publicado por: Eleкtro en 22 Noviembre 2012, 01:30 am
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.


Título: Re: separar un string en varias cadenas (Split)
Publicado por: Keyen Night en 22 Noviembre 2012, 01:46 am
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
  1. Imports System.Text.RegularExpressions
  2.  
  3.        Dim Expresión As String = String.Format("{0}[^{0}$]+{0}", Convert.ToChar(32))
  4.  
  5.        'Esta variable simula la que tu creas en tu aplicación'
  6.        Dim Comando As String = String.Format("Comando.exe {0}C:\ejemplo{0} {0}C:\carpeta\ruta{0} {0}D:\archivos{0}", Convert.ToChar(32))
  7.  
  8.        For Each x As Match In Regex.Matches(Comando, Expresión)
  9.            MessageBox.Show(x.Value)
  10.        Next
  11.  


Título: Re: separar un string en varias cadenas (Split)
Publicado por: Eleкtro en 22 Noviembre 2012, 08:06 am
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
  1.            Dim Expresión As String = String.Format("{0}[^{0}]+?{0}", Convert.ToChar(32))
  2.  
  3.            'Esta variable simula la que tu creas en tu aplicación'
  4.            Dim Comando As String = String.Format(playerargs, Convert.ToChar(32))
  5.  
  6.            For Each x As Match In Regex.Matches(Comando, Expresión)
  7.                MessageBox.Show(x.Value)
  8.            Next
  9.  
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
  1.            Str = Replace(playerargs, " " & ControlChars.Quote, "")
  2.            ' 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
  1.            Dim Str As String
  2.            ' Elimino los espacios entre argumentos
  3.            Str = Replace(playerargs, " " & ControlChars.Quote, ControlChars.Quote)
  4.            ' El contenido de Cadena queda así: "C:\Ruta 1""C:\Ruta 2""Más rutas..."
  5.  
  6.            ' El patrón delimitador (comilla)
  7.            Dim Pattern As String = ControlChars.Quote
  8.  
  9.            Dim ArgsArray() As String 'Creamos un array
  10.  
  11.            ArgsArray = Split(Str, Pattern) 'Llenamos el array con las cadenas cortadas.
  12.  
  13.            ' Mostramos como ha quedado el resultado
  14.            For Each folder In ArgsArray
  15.                If Not folder = Nothing Then
  16.                    Console.WriteLine(folder)
  17.                    MessageBox.Show(folder)
  18.                End If
  19.  
  20.  
  21.            If randomize.Checked = True Then
  22.                '  RandomiseFile("c:\1.txt")
  23.            End If
  24.  

primero me muestra una caja vacía:
(http://img690.imageshack.us/img690/5559/prtscrcaptureqh.jpg)
(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:
(http://img59.imageshack.us/img59/6059/prtscrcapture2h.jpg)



Título: Re: (Solucionado) separar un string en varias cadenas (Split)
Publicado por: Novlucker en 22 Noviembre 2012, 13:20 pm
Los índices ({0}) no son de las expresiones regulares, son del string.format :P

Saludos