[Ayuda] Leer linea de un fichero en Vb.Net

Iniciado por TMarmol, 19 Octubre 2013, 14:10 PM

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

TMarmol

Tengo un problema, necesito que mi programa lea un fichero y muestre solo una linea

El fichero que necesito leer tiene una estructura parecida a un archivo xml, pero tiene una extension distinta, por ejemplo:
Código (xml) [Seleccionar]
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<paramsfo add_hidden="false">
  <param key="ACCOUNT_ID" fmt="utf8" max_len="16">e64a7aea5442c4a</param>
  <param key="ATTRIBUTE" fmt="int32" max_len="4">0</param>
  <param key="CATEGORY" fmt="utf8" max_len="4">SD</param>


Necesito que lea solo la linea "CATEGORY" y que me devuelva en este caso "SD"
Solo consigo que lea el fichero entero pero no una linea expecifica.

Se puede buscar esa linea por un string o por numero de linea, tengo comprobado que siempre es el mismo numero de linea.
Gracias de ante mano

Eleкtro

#1
Yo no se mucho sobre la estructura xml, xmnls, y esas variantes que existen, pero si no me equivoco al fin y al cabo todos son XML y se pueden leer las propiedades/atributos/nodos de la misma manera, repito, en caso de que no me esté equivocando, y en ese caso te puedes servir de las Classes de .NET para leer archivos XML.

De todas formas, por si las moscas, te enseño el modo de obtener el valor usando expresiones regulares:

Código (vbnet) [Seleccionar]
   Sub Main()

       Dim str = <a><![CDATA[<param key="CATEGORY" fmt="utf8" max_len="4">SD</param>]]></a>.Value

       Dim Value As String = _
           System.Text.RegularExpressions.Regex.Match(str, "CATEGORY.+>(.*)<") _
           .Groups(1).Value

       Console.WriteLine(Value)

   End Sub


saludos!








TMarmol

Cita de: EleKtro H@cker en 19 Octubre 2013, 15:52 PM
Yo no se mucho sobre la estructura xml, xmnls, y esas variantes que existen, pero si no me equivoco al fin y al cabo todos son XML y se pueden leer las propiedades/atributos/nodos de la misma manera, repito, en caso de que no me esté equivocando, y en ese caso te puedes servir de las Classes de .NET para leer archivos XML.

De todas formas, por si las moscas, te enseño el modo de obtener el valor usando expresiones regulares:

Código (vbnet) [Seleccionar]
   Sub Main()

       Dim str = <a><![CDATA[<param key="CATEGORY" fmt="utf8" max_len="4">SD</param>]]></a>.Value

       Dim Value As String = _
           System.Text.RegularExpressions.Regex.Match(str, "CATEGORY.+>(.*)<") _
           .Groups(1).Value

       Console.WriteLine(Value)

   End Sub


saludos!

No es exactamente lo que busco pero también me sirve, con eso solo extraigo el texto que hay entre los ">     <", que es una parte de lo que necesito.
La otra parte es extraer solo una linea, el archivo completo tiene 14 lineas, que no son siempre iguales y yo necesito extraer una linea sin saber su contenido completo, se que siempre es la linea nº 13 y que contiene "key='TITLE'", pero no conozco el resto de la linea.

Lo primero seria extraer solo esa linea y después mostrar en contenido gracias al código que has mostrado antes.
El programa debe abrir el archivo buscar en el la linea que contenga "key='TITLE'"  y mostrar su contenido
Gracias.

Eleкtro

Para obtener la linea número 13 puedes usar este snippet de una función genérica que hice hace tiempo:

Código (vbnet) [Seleccionar]
#Region " Read TextFile Line Function "

   ' [ Read TextFile Line Function ]
   '
   ' Examples :
   '
   ' MsgBox(Read_TextFile_Line("C:\File.txt", 1))
   ' Dim str As String = Read_TextFile_Line("C:\File.txt", 3)

   Private Function Read_TextFile_Line(ByVal File As String, ByVal Line_Number As Long) As String

       Dim Lines() As String = {String.Empty}
       Dim Line_Length As Long = 0

       Try
           Lines = IO.File.ReadAllLines(File)
           Line_Length = Lines.LongLength - 1
           Return Lines(Line_Number - 1)

       Catch ex As IO.FileNotFoundException
           MessageBox.Show(String.Format("File not found: ""{0}""", _
                                         File), _
                           Nothing, _
                           MessageBoxButtons.OK, _
                           MessageBoxIcon.Error)

       Catch ex As IndexOutOfRangeException
           MessageBox.Show(String.Format("Attempted to read line {0}, but ""{1}"" has {2} lines.", _
                                         Line_Number, _
                                         File, _
                                         Line_Length + 1), _
                           Nothing, _
                           MessageBoxButtons.OK, _
                           MessageBoxIcon.Error)

       Catch ex As Exception
           Throw New Exception(String.Format("{0}: {1}", _
                                             ex.Message, _
                                             ex.StackTrace))

       Finally
           Lines = Nothing
           Line_Length = Nothing

       End Try

       Return Nothing

   End Function

#End Region


Saludos!








TMarmol

Cita de: EleKtro H@cker en 19 Octubre 2013, 16:06 PM
Para obtener la linea número 13 puedes usar este snippet de una función genérica que hice hace tiempo:

Código (vbnet) [Seleccionar]
#Region " Read TextFile Line Function "

   ' [ Read TextFile Line Function ]
   '
   ' Examples :
   '
   ' MsgBox(Read_TextFile_Line("C:\File.txt", 1))
   ' Dim str As String = Read_TextFile_Line("C:\File.txt", 3)

   Private Function Read_TextFile_Line(ByVal File As String, ByVal Line_Number As Long) As String

       Dim Lines() As String = {String.Empty}
       Dim Line_Length As Long = 0

       Try
           Lines = IO.File.ReadAllLines(File)
           Line_Length = Lines.LongLength - 1
           Return Lines(Line_Number - 1)

       Catch ex As IO.FileNotFoundException
           MessageBox.Show(String.Format("File not found: ""{0}""", _
                                         File), _
                           Nothing, _
                           MessageBoxButtons.OK, _
                           MessageBoxIcon.Error)

       Catch ex As IndexOutOfRangeException
           MessageBox.Show(String.Format("Attempted to read line {0}, but ""{1}"" has {2} lines.", _
                                         Line_Number, _
                                         File, _
                                         Line_Length + 1), _
                           Nothing, _
                           MessageBoxButtons.OK, _
                           MessageBoxIcon.Error)

       Catch ex As Exception
           Throw New Exception(String.Format("{0}: {1}", _
                                             ex.Message, _
                                             ex.StackTrace))

       Finally
           Lines = Nothing
           Line_Length = Nothing

       End Try

       Return Nothing

   End Function

#End Region


Saludos!
Perfecto!
era justo lo que necesitaba.
Muchas gracias