none
Leer solo una columna de un txt desde un numero de fila X RRS feed

  • Pregunta

  • Sres, buenas tardes les comento que tengo un pequeño problema para leer archivos TXT, lo que necesito es leer una columna completa desde una fila X, es decir por ejemplo:

    Campo1;campo2;campo3;campo4

    dato1;dato1;dato1;dato1

    dato2;dato2;dato2;dato2

    dato3;dato3;dato3;dato3

    dato4;dato4;dato4;dato4

    necesito comenzar a leer el archivo en la columna "Campo2" desde la fila "Dato2"; en resumen deberia leer solo "dato2" "dato3" "dato4" de la columan "Campo2"

    Espero ser claro en el ejemplo, he hecho pruebas pero no puedo resolver el pasarle el parametro (fila,columna) al ciclo for para la lectura.

    (Visual Studio 2010)



    jueves, 28 de febrero de 2013 15:15

Todas las respuestas

  • hola

    no evaluaste usar

    http://filehelpers.sourceforge.net/

    con este framework para tratar archivos podrias mapear ese txt a una clase y tomar solo una de las propiedades para trabjar con los datos

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    jueves, 28 de febrero de 2013 16:17
  • Leandro muchas gracias por tomarte tu tiempo en responder a la brevedad, revise el link que me enviaste y no se como usarlo, llevo programando con visual studio unos 3 meses y aun no lo entiendo en su totalidad. Pero bueno , te comento que con el código que a continuación te presento lee por completo el TXT, así que estoy buscando la forma de consultar por la columna X, con un bloque IF, en caso de ser TRUE que realice una acción predeterminada.

    Codigo que uso:

        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser("Archivo con ruta y extension")
                MyReader.TextFieldType = FileIO.FieldType.Delimited
                MyReader.SetDelimiters(";") ' Delimitador
                Dim currentRow As String()
                While Not MyReader.EndOfData
                    Try
                        currentRow = MyReader.ReadFields()
                        Dim currentField As String
                        Dim ContFilas As Integer = 0
                        For Each currentField In currentRow
                            MsgBox(currentField)
                            ContFilas = ContFilas + 1
                        Next
                    Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                        MsgBox("Line " & ex.Message & _
                        "No es valido.")
                    End Try
                End While
            End Using

    Debo añadir que el numero de columnas es limitado (60 columnas) y los nombres de las columnas también se conocen. 

    Ahora pensando en otra opción seria llevar todo a un datagrid y después recorrer el Grid (que es mas fácil) pero menos optimo.

    Espero puedas echarme una mano, saludos.


    jueves, 28 de febrero de 2013 17:46
  • Realizando muchas mas pruebas llegue al código definitivo que a continuación les dejo:

    Dim DGBox As New OpenFileDialog
            DGBox.Filter = "Archivos de texto plano (.txt)|*.txt"
            DGBox.Multiselect = False
            DGBox.FileName = ("C:\prueba.txt")
            If DGBox.FileName.Length > 0 Then
                Using Archivo As New System.IO.StreamReader(DGBox.FileName)
                    Dim Columna() As String
                    Dim Linea As Integer = 1
                    While Not Archivo.EndOfStream
                        Columna = Archivo.ReadLine.Split(";")
                        Linea += 1
                        If Linea > 1 Then  ' Mediante este bloque controlo las lineas que quiero mostrar
                            MsgBox(Columna(2)) ' El Array Columna(2) es la columna que quiero rescatar
                        End If
                    End While
                End Using
            End If

    En Resumen, con este código leo desde un archivo .txt de 60 columnas y 12.000 lineas, se realiza un lectura total del archivo (lo que no es eficiente) y voy rescatando los datos de la columna que necesito (columna(2)), desde la fila que necesito (Linea=2) y para el ejemplo lo muestro con un MsgBox (MsgBox(Columna(2))

    Cualquier duda avísenme y les agrego mas comentarios.

    jueves, 28 de febrero de 2013 21:59
  • otra forma seria tener los datos en un list haber que te parece

     Public Structure Dato
    
            Dim Dato1 As String
            Dim Dato2 As String
            Dim Dato3 As String
        End Structure
    
        Function LeerArchivo(ByVal PathFile As String) As List(Of Dato)
            Dim datos As New List(Of Dato)
            Dim str1() As String
            Dim datoTemp As Dato
    
            FileOpen(1, "Path", OpenAccess.Read)
            Do While Not EOF(1)
                str1 = LineInput(1).Split(";")
                datoTemp.Dato1 = str1(0)
                datoTemp.Dato2 = str1(1)
                datoTemp.Dato3 = str1(2)
                datos.Add(datoTemp)
            Loop
            FileClose(1)
            LeerArchivo = datos
        End Function
    
        Sub LLamaleerArchivo()
            Dim Datos As New List(Of Dato)
    
            Datos = LeerArchivo("Path")
    
        End Sub

    saludos

    Alvaro

    sábado, 2 de marzo de 2013 17:30