ReadText VB
-
Estuvimos hablando por msn pero se tuvo que ir antes de solucionarlo. El archivo sigue el patrón:
PALABRA - numero variable de tabuladores - valor numérico que se desea conseguir - fin de línea
Yo no he trabajado nunca con expresiones regulares pero si mal no recuerdo se desean extraer los números de todas las cadenas. Creo que la palabra del principio sólo contiene letras. -
Hola!, estoy haciendo un proyecto bastante serio que ya finalicé para unos amigos. La verdad es que es un choyo el programa.
Lo único que necesito ahora es que un textbox me lea determinado archivo .txt
Es decir, con un streamreader lo consigo y tal.Dim R As New IO.StreamReader(CurDir() & "\Archivo.txt") TextBox1.Text = R.ReadToEnd R.Close()
bien, eso te muestra en el textbox todo el archivo.txt que hay dentro.
¿Cómo puedo hacer para que solo me lea determinadas cosas? es decir, si en el archivo.txt hay.
"Hola, yo me llamo pedro ¿y tú?"Pues que cuando lo lea el textbox que salga por ejemplo "Hola, me llamo"
¿se podría hacer no? xD -
Probablemente haya métodos para leer solo un determinado número de caracteres, por ejemplo creo que readline te lle hasta el primer salto de línea, pero todo esto no te hace falta obligatoriamente. Usa el método substr de la clase String para extraer los caracteres de la posición x hasta la y de la cadena que has obtenido del archivo. Un saludo.
-
Yo había pensado en hacer splits. Se sacarlos de una variable string que yo haga, pero no se sacarla de un archivo.
Ando más perdio que un hijo puta en el cumpleaños de su padre xD -
si no das más pistas vamos mal. ¿qué patrón sigue el texto del archivo? Cada línea tiene un contenido fijo? por ejemplo:
fulanito 190.268.1.1 20/10/11
menganito 165.265.5.72 12/11/11
etcO no sigue ningún patrón y es un texto o una redacción sin más?
Mediante expresiones regulares se pueden hacer muchas cosas siempre que se conozca el patrón del contenido del archivo. A veces no es necesario y basta con splits.
-
^[a-zA-Z]+[ ]+[0-9]+
Quizá eso sirva entonces
El primer caracter (^) indica comienzo de string.
Después tenemos: [a-zA-Z]+
Esto indica cualquier caracter entre la a y la z minúsculas, y cualquier caracter entre la A y la Z mayus. El "+" indica que se repite 1 o más veces.Por tanto de momento aceptamos cualquier string que empiece por letras, mayúsculas o minúsculas. No aceptamos que empiece con algo que no sean letras, por ejemplo la cadena:
3abc
no se aceptaría.
Si empieza por un espacio, un guión etc tampoco.
Una cadena vacía tampoco se aceptaría.Bueno, seguimos: [ ]+
Eso indica un caracter espacio repetido 1 o más veces.
Por tanto ahora aceptamos cadenas de tipo:
hola finPor último: [0-9]+
Cualquier número repetido una o más veces.
Por tanto creo que con eso cumplimos requisitos. La expresión regular sólo se cumplira siempre que la cadena sea de este estilo:
n 8
Esa sería la cadena más corta aceptada. A partir de ahí aceptaría cadenas mucho más largas:
aytTRRBBdgalkjf 1237651209421949Para visual Basic, un código ejemplo:
Try If (Regex.IsMatch("hola 1234", "^[a-zA-Z]+[ ]+[0-9]+")) Then MsgBox("Match") Else MsgBox("Mismatch") End If Catch ex As Exception End Try
Se necesita añadir un import:
Imports System.Text.RegularExpressionsPara tratar luego la cadena, o los resultados parciales de la coincidencia ya harán falta más cosas, en esta página vienen bastantes cosas sobre expresiones regulares:
[http://www.regular-expressions.info/tutorial.html][0]">[http://www.regular-expressions.info/tutorial.html][1][0]: <a href=
[1]: http://www.regular-expressions.info/tutorial.html -
No hay espacios que yo sepa, sólo tabuladores, no sé si da lo mismo. Lo único que Anghios quiere es conseguir los números del final, todas las cadenas son de ese tipo por lo que no hace falta comprobarlo.
Un saludo.
-
vale, he retocado la expresion para tomar a continuacion el valor del numero que quiere coger:
"^(?[a-zA-Z]+)[\t| ]+(?[0-9]+)"
Es prácticamente la misma expresion de antes pero añadiendo lo q se llaman "grupos". He hecho un grupo llamado "palabra" y otro llamado "numero".
El grupo palabra se compone de:
[a-zA-Z]+
El grupo numero se compone de:
[0-9]+Como digo, es lo mismo, solo que añadiendole .
He cambiado lo de los espacios. Ahora sirve tanto si hay espacios, como si hay tabuladores, como si hay de las dos cosas mezcladas:
[\t| ]+
\t es tabulador, luego hay un OR "|" y un espacio. Es decir, tabulador OR espacio repetido al menos 1 vez.Vale, ahora vamos a darle uso:
Try Dim expRegular As Regex = New Regex("^(?[a-zA-Z]+)[\t| ]+(?[0-9]+)") Dim matches As Match = expRegular.Match(textSubject.Text) If matches.Success Then textResults.Text = "Sí. El numero es: " & matches.Groups("numero").Value Else textResults.Text = "No cuadra con la Exp. Regular" End If Catch ex As Exception End Try
Eso es el código que he metido en un botón de prueba, para andar trasteando la expresion regular. Tengo un campo de texto (textSubject) donde escribo una frase. Un boton en cuyo evento se ejecuta ese codigo. Y por ultimo un segundo campo de texto (textResults) para mostrar un resultado.
Bien, problemas que puede tener esta expresion:
que el numero tenga decimales, por ejemplo si la frase es:blablabla 25.16
En ese caso la exp regular cogeria el numero 25
El .16 lo omitiria, ya que no cuadra en la expresion (el punto no está entre 0-9)
Otro posibe problema, que la frase no empiece con letras. Pero si eso no puede ocurrir pues nada.