ReadText VB

Topic created · 8 Posts · 1064 Views
  • 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
    etc

    O 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 fin

    Por ú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 1237651209421949

    Para 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.RegularExpressions

    Para 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.

Log in to reply