none
Leer un archivo a partir de una línea hasta encontrar otra. RRS feed

  • Pregunta

  • Hola.

    Gracias por la ayuda que puedan prestar.

    Como puedo leer un archivo a partir de una línea, sin contar ésta, hasta que se encuentre otra línea, sin contar ésta otra también.

    Gracias de nuevo.

    sábado, 13 de junio de 2020 8:08

Todas las respuestas

  • Imagino que obteniendo el número de línea (Index) que contiene el texto y creando un For Next para evitar lineas con index menores. Pero no recuerdo como hacerlo.
    sábado, 13 de junio de 2020 9:34
  • No tienes más remedio que ir leyendo todo línea por línea hasta llegar a la que quieras. No existe una forma de saltar directamente a la primera línea deseada sin leer las anteriores. Una forma de hacerlo es con un bucle que use un StreamReader, y un contador que se vaya incrementando en el bucle. Por ejemplo, algo parecido a lo siguiente:

    Using sr As New StreamReader("c:\ruta\fichero.txt"))
        Dim nLinea as Integer = 1;
        While nLinea <= ultimaLineaDeseada
            Dim linea As String = sr.ReadLine()
            If (linea Is Nothing) Then Exit While
            If (nLinea >= primeraLineaDeseada)
                ' Procesar aquí la línea
            End If
            nLinea += 1
        End While
    End Using

    sábado, 13 de junio de 2020 11:28
  • Gracias por las respuestas.

    Pero tengo que suponer que no sé, que línea contiene el principio de la búsqueda.

    No necesito el número de cada línea que se lee, si no, el texto de la línea completa

    'Archivo.txt:

    NUMEROS
    uno
    dos
    tres
    COLORES
    blanco
    rojo

    etc.

    Solo desde COLORES hasta el final del archivo sin obtener COLORES.

            Using sr As New StreamReader(path)
                Dim nLinea As Integer = 1
                While CBool(nLinea) '<= ultimaLineaDeseada,, ReadToEnd
                    Dim linea As String = sr.ReadLine()
                    If linea Is Nothing Then Exit While
                    If nLinea >= 5 Then 'primeraLineaDeseada. No se en que número de línea está COLORES
                        ListBox1.Items.Add(nLinea)
                    End If
                    nLinea += 1
                End While
            End Using

    Perdonen que no me haya expresado muy bien!

    Gracias otra vez.

    sábado, 13 de junio de 2020 12:48
  • No necesito el número de cada línea que se lee, si no, el texto de la línea completa

    En el ejemplo tenías las dos cosas: el número de la línea en la variable "nLinea" y el texto completo en la varable "linea".

    Solo desde COLORES hasta el final del archivo sin obtener COLORES

    OK, desde COLORES hasta que se vuelva a encontrar COLORES o se acabe el archivo ambas exclusive:

    Using sr As New StreamReader("c:\ruta\fichero.txt"))
        Dim encontrado1 as Boolean = False
        While True
            Dim linea As String = sr.ReadLine()
            If linea Is Nothing Then Exit While
            If linea = "COLORES" And Not encontrado1 Then
                ' Primera ocurrencia de COLORES
                encontrado1 = True
                Continue While
            End If
            If linea = "COLORES" Then 
                ' Segunda ocurrencia de COLORES
                Exit While
            End If
            ' Si alcanzamos este punto quiere decir que estamos entre los dos COLORES
            ' Procesar aquí la línea
            End If
    End Using
    Si siempre es hasta el final del archivo, y no esperas una segunda ocurrencia de COLORES (no estaba claro en tu pregunta), entonces puedes quitar el bloque que tiene el "If" de "Segunda ocurrencia".


    sábado, 13 de junio de 2020 14:52
  • Hola:
    En un Form con 1 ListBox y 1 Button, copia y pega el siguiente codigo
    Option Explicit On
    Option Strict On
    Imports System.IO
    Public Class Form5
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim Texto As String = String.Empty
            Using srLector As New StreamReader(Application.StartupPath & "\Archivo.txt")
                Dim Linea As String
                Linea = srLector.ReadLine()
                Do While Not (Linea Is Nothing)
                    If Contiene("COLORES", Linea) = True Then
                        Texto = srLector.ReadToEnd()
                    End If
                    Linea = srLector.ReadLine()
                Loop
            End Using
            Texto = Texto.Replace(vbCrLf, vbCr)
            Dim Lineas As String() = Texto.Split(CType(vbCr, Char()))
            For Each Fila As String In Lineas
                ListBox1.Items.Add(Fila)
            Next
        End Sub

        ' -------------------------------------------------------------
        ' VERIFICA SI UNA CADENA ESTA CONTENIDA DENTRO DE OTRA
        ' -------------------------------------------------------------
        Private Function Contiene(ByVal subcadena As String, ByVal cadOrigen As String) As Boolean
            Return CBool(IIf(cadOrigen.IndexOf(subcadena) = -1, False, True))
        End Function
    End Class

    Un saludo desde Bilbo
    Carlos
    sábado, 13 de junio de 2020 15:14
  • ListBox1.Items.Clear() 'Contenido en el Archivo: 'Linea 1 'Linea 2 'COLORES 'Linea 3 'Linea 4 'COLORES 'Linea 5 'Linea 6 'etcétera Using sr As New StreamReader("c:\ruta\fichero.txt") Dim encontrado1 As Boolean = False While True Dim linea As String = sr.ReadLine() If linea Is Nothing Then Exit While If linea = "COLORES" And Not encontrado1 Then ' Primera ocurrencia de COLORES encontrado1 = True Continue While End If If linea = "COLORES" Then ' Segunda ocurrencia de COLORES Exit While End If ' Si alcanzamos este punto quiere decir que estamos entre los dos COLORES ' Procesar aquí la línea ListBox1.Items.Add(linea) End While End Using 'Resultado: 'Linea 1 'Linea 2 'Linea 3 'Linea 4

    'Solo necesito: 'Linea 3 'Linea 4


    • Editado Rafael F.M domingo, 14 de junio de 2020 2:03
    sábado, 13 de junio de 2020 16:26
  •   'Solo necesito:
            'Linea 3
            'Linea 4

    Si no me equivoco, el error está en que el primer And debe ser Or.

    Pero esto se te tendría que ocurrir a ti mismo. Cuando alguien te pone un bloque de código como respuesta en el foro, en general está escrito de memoria y sin probar, por lo que es razonable esperar que tenga pequeños errorcillos. La intención no es que lo copies y pegues sin cambiar ni una sola coma esperando que funcione a la primera. Al contrario, es solo orientativo para que te hagas una idea general acerca del tipo de operaciones que podrían conducir a la solución. Se supone que tienes que examinarlo, entenderlo, y a partir de ahí escribir tu propio código en Visual Studio y corregir sobre la marcha los errores que se produzcan. Para eso tienes el debugger, que te permite ejecutarlo paso a paso contra tus propios datos, siguiendo la ejecución y viendo dónde difiere de lo que esperabas.

    sábado, 13 de junio de 2020 19:40
  •   'Solo necesito:
            'Linea 3
            'Linea 4

    Si no me equivoco, el error está en que el primer And debe ser Or.

    Pero esto se te tendría que ocurrir a ti mismo. Cuando alguien te pone un bloque de código como respuesta en el foro, en general está escrito de memoria y sin probar, por lo que es razonable esperar que tenga pequeños errorcillos. La intención no es que lo copies y pegues sin cambiar ni una sola coma esperando que funcione a la primera. Al contrario, es solo orientativo para que te hagas una idea general acerca del tipo de operaciones que podrían conducir a la solución. Se supone que tienes que examinarlo, entenderlo, y a partir de ahí escribir tu propio código en Visual Studio y corregir sobre la marcha los errores que se produzcan. Para eso tienes el debugger, que te permite ejecutarlo paso a paso contra tus propios datos, siguiendo la ejecución y viendo dónde difiere de lo que esperabas.

    Lo sé y re pruebo con las respuestas, pero sigo preguntando! Será por tiempo con, solo, medios orientativos de Internet¡¡¡

    Edit.

    ...







    • Editado Rafael F.M domingo, 14 de junio de 2020 4:16
    domingo, 14 de junio de 2020 1:40
  • Gracias J. Carlos.

    En espera dela siguienntee cadeena¡¡¡

    If linea = "COLORES" OrElse Not encontrado1 Then
    'Falta ignorar Linea 2
    end if



    • Editado Rafael F.M domingo, 14 de junio de 2020 4:07
    domingo, 14 de junio de 2020 1:52
  •         ListBox1.Items.Clear()
            lst1.Clear()
            Dim lst As New ArrayList(File.ReadAllLines(ptdesde))
            Dim idxof1 = CType(lst.IndexOf("COLORES"), String) 'return la primera aparicion = 2
            Using sr As New StreamReader(ptdesde)
                Dim encontrado1 As Boolean = False
                While True
                    Dim linea As String = sr.ReadLine '& sr.ReadLine.Count + 1
                    If linea Is Nothing Then Exit While
                    If linea = "COLORES" Or Not encontrado1 Then
                        encontrado1 = True
                        Continue While
                    End If
                    If linea = "CALORES" Then
                        ' Segunda ocurrencia de COLORES
                        Exit While
                    End If
                    lst1.Add(linea)
                End While
            End Using
            'Dim index As Integer = 0
            lst1.RemoveRange(0, CInt(idxof1) - 1)
            ListBox1.Items.AddRange(lst1.ToArray)
    Edit. Esta mal. No funciona. Si antes de colores hay mas de dos lines no funcionaba
          lst1.RemoveAt(0)

    Ahora lo escribo bien:

            ListBox1.Items.Clear()
            lst1.Clear()
            Dim lst As New ArrayList(File.ReadAllLines(ptdesde))
            Dim idxof1 = CType(lst.IndexOf("COLORES"), String) 'return la primera aparicion = 2
            Using sr As New StreamReader(ptdesde)
                Dim encontrado1 As Boolean = False
                While True
                    Dim linea As String = sr.ReadLine '& sr.ReadLine.Count + 1
                    If linea Is Nothing Then Exit While
                    If linea = "COLORES" Orelse Not encontrado1 Then
                        encontrado1 = True
                        Continue While
                    End If
                    If linea = "CALORES" Then
                        Exit While
                    End If
                    lst1.Add(linea)
                End While
            End Using
            'Dim index As Integer = 0
            lst1.RemoveRange(0, CInt(idxof1) - 1)
            ListBox1.Items.AddRange(lst1.ToArray)


    El archivo contiene:

    Linea 1
    Linea 2
    Linea 3
    Linea 4
    Linea 4
    etc...
    COLORES
    Linea 01
    Linea 02
    CALORES
    Linea 5
    Linea 6
    etc...

    El resultado es:

    Linea 01
    Linea 02


    seguro que se puede hacer mucho mejor pero lo anterior me funcionó.
    Si conocen algo mejor y quieren compartirlo, por favor, no dejen de hacerlo.
    muchas gracias por la ayuda.







    • Editado Rafael F.M domingo, 14 de junio de 2020 11:32
    domingo, 14 de junio de 2020 6:19
  • Hola:
    >  Solo desde COLORES hasta el final del archivo sin obtener COLORES. <
    En el ejemplo anterior cumplia con lo que pedias cuando yo lei el post.
    Si es solo las lineas que estan entre las lineas COLORES.
    Option Explicit On
    Option Strict On
    Imports System.IO
    Public Class Form5
        Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
            Dim Encontrado As Integer = 0
            Using srLector As New StreamReader(Application.StartupPath & "\Archivo.txt")
                Dim Linea As String
                Linea = srLector.ReadLine()
                Do While Not (Linea Is Nothing)
                    If Linea = "COLORES" Then
                        Encontrado += 1
                        Linea = srLector.ReadLine()
                        Continue Do
                    End If
                    Select Case Encontrado
                        Case 1
                            ListBox1.Items.Add(Linea)
                        Case 2
                            Exit Do
                    End Select
                    Linea = srLector.ReadLine()
                Loop
            End Using
        End Sub
    End Class

    Un saludo desde Bilbo
    Carlos
    domingo, 14 de junio de 2020 7:17
  • >  Solo desde COLORES hasta el final del archivo sin obtener COLORES. <

    Gracias.

    Estaba empezando a solucionarme mi problema y me costaba darme cuenta de lo mas 
    sencillo.
    Por eso he tratado de obtener respuestas aquí.

    Sin la ayuda de la respuestas todavía estaría probando y probando.

    >  Solo desde COLORES hasta el final del archivo sin obtener COLORES. <
    Eso fue por si no conseguía lo primero.




    • Editado Rafael F.M domingo, 14 de junio de 2020 7:40
    domingo, 14 de junio de 2020 7:39
  • ¿Alguna novedad sobre la consulta realizada? ¿Han sido útiles las respuestas proporcionadas?  
    lunes, 15 de junio de 2020 21:05
    Moderador