Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: TMarmol en 19 Octubre 2013, 14:10 pm



Título: [Ayuda] Leer linea de un fichero en Vb.Net
Publicado por: TMarmol en 19 Octubre 2013, 14:10 pm
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
  1. <?xml version="1.0" encoding="utf-8" standalone="yes"?>
  2. <paramsfo add_hidden="false">
  3.  <param key="ACCOUNT_ID" fmt="utf8" max_len="16">e64a7aea5442c4a</param>
  4.  <param key="ATTRIBUTE" fmt="int32" max_len="4">0</param>
  5.  <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


Título: Re: [Ayuda] Leer linea de un fichero en Vb.Net
Publicado por: Eleкtro 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
  1.    Sub Main()
  2.  
  3.        Dim str = <a><![CDATA[<param key="CATEGORY" fmt="utf8" max_len="4">SD</param>]]></a>.Value
  4.  
  5.        Dim Value As String = _
  6.            System.Text.RegularExpressions.Regex.Match(str, "CATEGORY.+>(.*)<") _
  7.            .Groups(1).Value
  8.  
  9.        Console.WriteLine(Value)
  10.  
  11.    End Sub

saludos!


Título: Re: [Ayuda] Leer linea de un fichero en Vb.Net
Publicado por: TMarmol en 19 Octubre 2013, 16:02 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
  1.    Sub Main()
  2.  
  3.        Dim str = <a><![CDATA[<param key="CATEGORY" fmt="utf8" max_len="4">SD</param>]]></a>.Value
  4.  
  5.        Dim Value As String = _
  6.            System.Text.RegularExpressions.Regex.Match(str, "CATEGORY.+>(.*)<") _
  7.            .Groups(1).Value
  8.  
  9.        Console.WriteLine(Value)
  10.  
  11.    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.


Título: Re: [Ayuda] Leer linea de un fichero en Vb.Net
Publicado por: Eleкtro 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
  1. #Region " Read TextFile Line Function "
  2.  
  3.    ' [ Read TextFile Line Function ]
  4.    '
  5.    ' Examples :
  6.    '
  7.    ' MsgBox(Read_TextFile_Line("C:\File.txt", 1))
  8.    ' Dim str As String = Read_TextFile_Line("C:\File.txt", 3)
  9.  
  10.    Private Function Read_TextFile_Line(ByVal File As String, ByVal Line_Number As Long) As String
  11.  
  12.        Dim Lines() As String = {String.Empty}
  13.        Dim Line_Length As Long = 0
  14.  
  15.        Try
  16.            Lines = IO.File.ReadAllLines(File)
  17.            Line_Length = Lines.LongLength - 1
  18.            Return Lines(Line_Number - 1)
  19.  
  20.        Catch ex As IO.FileNotFoundException
  21.            MessageBox.Show(String.Format("File not found: ""{0}""", _
  22.                                          File), _
  23.                            Nothing, _
  24.                            MessageBoxButtons.OK, _
  25.                            MessageBoxIcon.Error)
  26.  
  27.        Catch ex As IndexOutOfRangeException
  28.            MessageBox.Show(String.Format("Attempted to read line {0}, but ""{1}"" has {2} lines.", _
  29.                                          Line_Number, _
  30.                                          File, _
  31.                                          Line_Length + 1), _
  32.                            Nothing, _
  33.                            MessageBoxButtons.OK, _
  34.                            MessageBoxIcon.Error)
  35.  
  36.        Catch ex As Exception
  37.            Throw New Exception(String.Format("{0}: {1}", _
  38.                                              ex.Message, _
  39.                                              ex.StackTrace))
  40.  
  41.        Finally
  42.            Lines = Nothing
  43.            Line_Length = Nothing
  44.  
  45.        End Try
  46.  
  47.        Return Nothing
  48.  
  49.    End Function
  50.  
  51. #End Region

Saludos!


Título: Re: [Ayuda] Leer linea de un fichero en Vb.Net
Publicado por: TMarmol en 19 Octubre 2013, 17:12 pm
Para obtener la linea número 13 puedes usar este snippet de una función genérica que hice hace tiempo:

Código
  1. #Region " Read TextFile Line Function "
  2.  
  3.    ' [ Read TextFile Line Function ]
  4.    '
  5.    ' Examples :
  6.    '
  7.    ' MsgBox(Read_TextFile_Line("C:\File.txt", 1))
  8.    ' Dim str As String = Read_TextFile_Line("C:\File.txt", 3)
  9.  
  10.    Private Function Read_TextFile_Line(ByVal File As String, ByVal Line_Number As Long) As String
  11.  
  12.        Dim Lines() As String = {String.Empty}
  13.        Dim Line_Length As Long = 0
  14.  
  15.        Try
  16.            Lines = IO.File.ReadAllLines(File)
  17.            Line_Length = Lines.LongLength - 1
  18.            Return Lines(Line_Number - 1)
  19.  
  20.        Catch ex As IO.FileNotFoundException
  21.            MessageBox.Show(String.Format("File not found: ""{0}""", _
  22.                                          File), _
  23.                            Nothing, _
  24.                            MessageBoxButtons.OK, _
  25.                            MessageBoxIcon.Error)
  26.  
  27.        Catch ex As IndexOutOfRangeException
  28.            MessageBox.Show(String.Format("Attempted to read line {0}, but ""{1}"" has {2} lines.", _
  29.                                          Line_Number, _
  30.                                          File, _
  31.                                          Line_Length + 1), _
  32.                            Nothing, _
  33.                            MessageBoxButtons.OK, _
  34.                            MessageBoxIcon.Error)
  35.  
  36.        Catch ex As Exception
  37.            Throw New Exception(String.Format("{0}: {1}", _
  38.                                              ex.Message, _
  39.                                              ex.StackTrace))
  40.  
  41.        Finally
  42.            Lines = Nothing
  43.            Line_Length = Nothing
  44.  
  45.        End Try
  46.  
  47.        Return Nothing
  48.  
  49.    End Function
  50.  
  51. #End Region

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