Problema con un string

Iniciado por TickTack, 22 Mayo 2017, 14:01 PM

0 Miembros y 2 Visitantes están viendo este tema.

TickTack

Hola,

estaba haciendo un programa que lee cada linea de un archivo .txt.

Lo que pasa es que dentro de cada linea hay un IP que quiero extraer.
Para eso me hice un metodo.
Entonces lo que hago yo es pasarle la una determinada linea del archivo .txt. al metodo y por supuesto llamarlo.

Mi metodo es el siguiente:

Código (csharp) [Seleccionar]

public void Pasador_a_IP(string texto)
       {
           string ip = string.Empty;
           int puntos = 0;
           string[] numbers = Regex.Split(texto, @"\D+");
           foreach (string value in numbers)
           {
               if(puntos < 3)
               {
                   ip = ip + value + ".";
                   puntos++;
               }
               else
               {
                   ip = ip + value;
               }
           }

           label3.Text = ip;
     }


Pero cuando inicio el programa en label3 solamente veo el texto "label3"(que es el texto que Visual Studio genera sino se cambia eso).

No entiendo. Me quiero matar. Le hice muchas vueltas a eso. Y seguro que cometi otra estupidez. Pero cual? Me quiero matar. Me vuelve loco.

Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Shell Root

Y donde estás llamando el evento? Es decir, debería ser en el Load para cuando inicie el formulario tenga ya el valor en el Label.
Por eso no duermo, por si tras mi ventana hay un cuervo. Cuelgo de hilos sueltos sabiendo que hay veneno en el aire.

dato000

en la variable texto que es lo que estas enviando?? ya validaste la información que estas pasando como valor a esa función??

Creo que el error debe estar en el momento que estas leyendo el archivo y asignando los valores a la variable texto.

Creo que debes dejar toda la función que realizar el procedimiento de lectura de ese archivo txt para poder entender como estas usando esa función



TickTack

#3
Hola,

bueno, la funcion la llamo desde un evento de click:

Código (csharp) [Seleccionar]

private void button1_Click(object sender, EventArgs e)
       {
           OpenFileDialog dialogo = new OpenFileDialog();
           if (dialogo.ShowDialog() == DialogResult.OK)
           {
               ruta = dialogo.FileName;
           }

           foreach (string line in File.ReadLines(ruta, Encoding.UTF8))
           {
               
               {
                   Pasador_a_IP(line);
               }
               


           }
       }


Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

Vuelta a lo mismo... Qué contiene ese fichero????

Tu problema seguramente yace en el contenido dle fichero, y que se refleja luego aquí:
string[] numbers = Regex.Split(texto, @"\D+");
           foreach (string value in numbers)

foreach ... value = 0 strings?. Seguro que Regex, no devolvió un array vacío???
Al menos saca por consola, qué contiene value, incluso si numbers.lenght es mayor que 0... Son preguntas demasiado tontas, cuya solución deberías ser capaz de resolver por tí mismo.
Visual Studio, es muy potente, tiene muchas facilidades para saber en cada momento, cual es el contenido de cada variable, puedes ejecutar paso a paso, puedes poner puntos de interrupción incondicionales (líneas), o condicionales de modo que cuando se cumpla la condición se pare ahí en ese punto la ejecución... revisas que debiera tener y si es preciso, moverte paso a paso por instrucciones hasta ver dónde ocurre el fallo.

Creo que lo que te pasa es que no conoces ni de lejos el IDE de Visual Studio (examina el menú DEBUG, que sea tu amigo íntimo, más que éste foro, ahí tienes infinidad de respuestas inmediatas), sin mencionar claro está el lenguaje, que ahí es natural que no quede todo claro.... pero con las facilidades que ofrece el IDE, encontrar ciertos errores es sumamente fácil...

Eleкtro

#5
1. La clase OpenFileDialog implementa la interfáz IDisposable, por lo tanto utiliza recursos administrados y/o no administrados que debes liberar para evitar fugas de memoria. Es algo básico. Úsala en consecuencia y libéra los recursos cuando hayas terminado de usarla.

2. Según he entendido, tu propósito es capturar las IP (IPv4 supongo) contenidas en un archivo de texto el cual supuestamente usa codificación UTF8, hasta ahí bien, el problema es la ejecución de tu planteamiento y la estructurización del código. Lo estás volviendo demasiado complicado ya que basicamente lo que haces es: leer el contenido del archivo de texto, convertirlo/acomodarlo a un Array de lineas de texto, partir cada linea utilizando RegEx mediante el metacaracter "\D", y a partir de aquí te complicas todavía más intentando contar los "puntos" hasta que al final te has quedado atascado sin saber como solucionar el algoritmo para que cumpla con su finalidad.

Mi consejo antes que nada es que olvides esa forma o esa mentalidad de implementar soluciones y de escribir código en general. Para empezar, el método "Pasador_de_ip" lo apropiado seria que éste cumpla con el propósito de parsear y devolver la IP, punto y final, no llegando a interactuar con los controles del form, eso hazlo en el bloque de código del controlador del evento del botón si quieres. Diseñando así el modelo o estructura tan solo conseguirás tener un código espaguetti que a la larga no sabrás por qué ni donde sucede cada cosa en tu Form; un diseño "desordenado" dificulta mucho la depuración.

Con respecto al problema, tan solo debes intentar tener más en cuenta que estás utilizando expresiones regulares, y por consiguiente puedes optimizar el algoritmo sencillamente utilizando una expresión que capture las IPv4 sin que tú tengas que tratar de reinventar la rueda partiendo cadenas de texto y analizando cada linea mediante un string-parsing casero que solo te está dando problemas... ( no he depurado tu código en profundidad, pero el problema seguro que está relacionado con las operaciones de "puntos" que haces en ese foreach )

Así pues, una forma más simplificada de llevarlo a cabo, a la par que reusable, sería de la siguiente forma:

Código (csharp) [Seleccionar]
private void button1_Click(object sender, EventArgs e) {

   string filepath = null;
   using (OpenFileDialog ofd = new OpenFileDialog()) {
       if (ofd.ShowDialog() == DialogResult.OK) {
           filepath = ofd.FileName;
       } else {
           filepath = string.Empty;
       }
   }

   if (!string.IsNullOrEmpty(filepath)) {
       string text = File.ReadAllText(filepath, Encoding.UTF8);
       MatchCollection matches = this.GetIpv4Matches(text);

       foreach (Match m in matches) {
           Debug.WriteLine(m.Value);
           label1.Text = m.Value;
       }
   }

}

public MatchCollection GetIpv4Matches(string text) {

   string ipv4Pattern =
       @"(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)";

   if (Regex.IsMatch(text, ipv4Pattern, RegexOptions.None, TimeSpan.FromMinutes(1))) {
       return Regex.Matches(text, ipv4Pattern, RegexOptions.None, TimeSpan.FromMinutes(1));
   } else {
       // Una excepción aquí si queremos controlar la ausencia de coincidencias de la expresión regular. O simplemente devolvemos nulo y listo.
       return null;
   }

}


( Adapta el código a tus necesidades, y recuerda poner a prueba esa expresión regular en busca de falsos positivos. ...no la construí yo. )

Sample de texto usado en el ejemplo:
Cita de: Archivo.txt127.0.0.0
hello 127.0.0.1 world
how 127.0.0.2 are 127.0.0.3 you?
good.

Resultado de ejecución:
Cita de: Visual Studio Debug Output Window127.0.0.0
127.0.0.1
127.0.0.2
127.0.0.3

¡Saludos!








TickTack

Hola NEBIRE,

Citar
foreach ... value = 0 strings?. Seguro que Regex, no devolvió un array vacío???
Citar

Porque value es igual a cero strings si representa a un vector de numbers?

Citar
Visual Studio, es muy potente, tiene muchas facilidades para saber en cada momento, cual es el contenido de cada variable, puedes ejecutar paso a paso, puedes poner puntos de interrupción incondicionales (líneas), o condicionales de modo que cuando se cumpla la condición se pare ahí en ese punto la ejecución... revisas que debiera tener y si es preciso, moverte paso a paso por instrucciones hasta ver dónde ocurre el fallo.

Como se puede saber cual es el contenido de cada variable con Visual Studio? El ejecutarlo paso a paso funciona tambien con los formularios? O se para cuando se termina de cargar los controles?

Lo siento. Yo no hice un curso de C#.

Hola Elektro,

gracias por tu aporte. Siento que te hayas tomado el tiempo por mi. Tu aporte me sirvio. Es mas: se me ocurrio otra solucion que creo que funcionara. Pero por supuesto: tus codigos son siempre los mejores porque tienen mucha sencillez y son potentes  ;)

Gracias y saludos
Citar
"Ninguna mentira puede inventarse lo suficientemente patán: el pueblo hispanohablante la cree. Por una consigna que se les dio, persiguieron a sus compatriotas con mayor encarnizamiento que a sus verdaderos enemigos."

Serapis

Quería decir que te asegures que tiene contenido, que no ha quedado desierto. Si es un vector, que su contenido tiene al menos un índice, etc...

Cita de: TickTack en 23 Mayo 2017, 14:43 PM
Como se puede saber cual es el contenido de cada variable con Visual Studio?
Cuando ejecutas el código en vez de ejecutarlo con F5, lo ejecutas con F11 (paso a paso)... para no extenderme:
https://msdn.microsoft.com/es-es/library/y740d9d3.aspx


Cita de: TickTack en 23 Mayo 2017, 14:43 PM
El ejecutarlo paso a paso funciona tambien con los formularios? O se para cuando se termina de cargar los controles?
Sí... Hay una carga inicial, donde se ejecuta sin pararse, típicamente si lo has puesto en modo Release, o Debug, antes lo compilará, por si hay errores que impidan la ejecución, luego irá al punto de entrada del proyecto y ahí, se para la ejecución. en un formulario, por ejemplo si no hay código en el LOAD, entonces saltará toda la interfaz de golpe (porque no hay código (del usuario) antes, donde pueda pararse, en ese caso, se parará cuando pulses algo de la interfaz (teclado, ratón, etc...)... por ejemplo en un botón (si tiene código asociado tal botón, claro). Incluso si tienes código asociado un evento MOUSEMOVE de un control o un evento Resize del formulario y tu estás cambiando el tamaño, salta a dicho evento y ahí para..
Con cada pulsación de la tecla F11, ejecuta una línea de código (en realidad una sentencia, ya que la misma puede estar partida en varias líneas (o como en el caso de VB, haber varias en una sola línea separadas por ':'.

Una vez que el depurador está parado en un punto, puedes seleccionar una variable (del tipo que sea, incluso un objeto o un array), y dejando un tiempito el cursor sobre la selección, muestra un iconito para desplegar y ver propiedades y valores. También pinchando con el otro botón del ratón, emerge un menú con opciones puedes desde ir a la definición de dicha variable, hasta pedirle que muestre el valor actual, o pedirle que quieres hacer un punto de interrupción de esa variable cuando se cumpla tal condición (abriría una ventana para indicar la condición, por ejemplo: V = 25, ó V = K, etc...)

...pero esto no es nuevo, esto viene de lejos, ni siquiera de Visual Studio 6.0, esto viene de los años 80... cuando Visual Studio ni siquiera estaba en la mente de nadie, cuando aún se tiraba de por ejemplo QuickBasic... y no ha cambiado significativamente, desde entonces... es mucho más completo, pero en esencia sigue siendo casi igual.

Un punto de interrupción incondicional se establece sobre una línea, del siguiente modo: lleva el cursor a la línea deseada, pulsa la tecla F9, verás que cambia el color de la línea que queda resaltada y a su derecha un puntito, marca lo que es (un punto de interrupción), pulsando en dicho punto, tiene el mismo objeto, quitar/poner el punto de interrupción. Estos puntos de interrupción son adecuados cuando no quieres estar paso a paso, si no sólo hasta llegar a ese punto, entonces ejecutas el código con F5, y cuando llegue a esa línea se detiene, luego para avanzar entre líneas, pulsas F11... cuando hayas resuleto dudas, continuas con F5, hasta que llegues a otro punto que desees detenerte y probar bien.  Se puede incluso ver la pila de llamadas en curso...

Hay mucho que explorar, mírate el menú DEBUG.... en profundidad...experimenta, hasta que tengas dominio de ello.

Te busco un vídeo, a ver si encuentro alguno, será más sencillo que escribir aquí 300 líneas de explicaciones.

Otro enlace:
https://msdn.microsoft.com/es-es/library/ms173083(v=vs.90).aspx
Vídeos:
https://www.youtube.com/watch?v=C0vDKXIq_9A
https://www.youtube.com/watch?v=QCPt9aOcd98
https://www.youtube.com/watch?v=u-HdLtqEOog
https://www.youtube.com/watch?v=rsfi68hR6vw
Estos están en inglés, no importa que si no lo entiendes, basta con que observes, ...aunque bueno, veo de buscarte alguno en español, también, solo que se enrrollan demasiado en explicaciones peregrinas en vez de ir al grano:
https://www.youtube.com/watch?v=KUhJmtgrk3k
https://www.youtube.com/watch?v=Ew5XAAJbGKI
https://www.youtube.com/watch?v=ayAv-EPCfk0
Tras ver un vídeo, a la derecha en la página siempre en las sugerencias salen muchos más relacionado con lo mismo... date un baño de vídeos, pierde 4 ó 5 horas viéndolos y ponlos en pausa, y prteactica tú mismo en tu equipo...

No te preocupes si en el vídeo sale un VS de una versión de VS distinta a la que tu tengas instalada, ya te digo que no ha cambiado sustancialemtne en los últimos 30 años... con decirte que para mí el 'asombro' más grande es que antes la ejecución paso a paso era con F8 (en VS 6.0) y ahora (desde NET) es con F11  :laugh: :laugh: