Leer Archivo .txt separados por coma – vb.net datatable split

Pregunta:


Por ayuda necesito pasar estas lenas separadas por coma a un datatable.

estas son las lineas. al final de la linea también la separación es una por coma.

000000000000056680640,07/07/2016,1606169715409,000000933.00,DB,EXI IB INFOTEP 501606169715409  RD$.00,409,0000000000000,
000000000000056680640,08/07/2016,0000000000004,000000044.02,DB,PAGO IMPUESTO 0.15  DGII 4 TRANS POR $ 29348.29 Del 01/07/2016 Al 07/07/2016,524,0000000000000,
000000000000056680640,11/07/2016,0000777517509,000007000.00,CR,IB MB desde 777517509 ,201,0000000000000,
000000000000056680640,13/07/2016,0000120000002,000050490.00,CR,DEPOSITO CHEQUE Y EFECTIVO,108,0000120000002,
000000000000056680640,13/07/2016,0160438491157,000008564.40,DB,EXI IB DGII 160438491157  RD$.00,409,0000000000000,
000000000000056680640,13/07/2016,0000000000000,000000075.00,DB,COMISION PAGO IMPUESTO X IB  RD$.00,524,0000000000000,
000000000000056680640,13/07/2016,0003579084854,000001851.27,DB,EXI IB DGII 3579084854  RD$.00,409,0000000000000,

Preguntado por: JOSE ANGEL RAMIREZ HERNANDEZ

jachguate

Generalmente hay un problema con los archivos separados por comas, y es que es un formato que no está estandarizado, y diferentes personas (y sistemas) asumen cosas diferentes en los detalles.

En palabras del artículo Comma-separated values de la Wikipedia en inglés, traducido libremente:

El formato de archivo CSV no está estandarizado. La idea básica de separar campos con una coma es clara, pero esa idea se complica cuando los datos de los campos a su vez contienen comas o, incluso, terminaciones de línea.

Diferentes implementaciones CSV pueden no soportar dichos datos en los campos, o pueden utilizar comillas para encerrar un campo. Las comillas no resuelven todo: Algunos campos podrían contener también comillas, así que ciertas implementaciones CSV podrían incluir caracteres o secuencias de escape.

En general mi recomendación es hacer una implementación robusta en cualquier sistema, lo cuál en el futuro te ahorrará sonrojos y dolores de cabeza. Por fortuna, no tienes por qué escribir el código que se encarga de los detalles.

Puedes basarte, por ejemplo, en la clase TextFieldParser

Un pequeño ejemplo de uso podría ser:

Using MyReader As New Microsoft.VisualBasic.FileIO.
    TextFieldParser("c:logsbigfile")

    MyReader.TextFieldType = 
        Microsoft.VisualBasic.FileIO.FieldType.Delimited
    MyReader.Delimiters = New String() {","}
    MyReader.CommentTokens = New String() {""}
    MyReader.HasFieldsEnclosedInQuotes = True
    Dim currentRow As String()
    'Loop through all of the fields in the file. 
    'If any lines are corrupt, report an error and continue parsing. 
    While Not MyReader.EndOfData
        Try
            currentRow = MyReader.ReadFields()

            Dim newRow = dTable.Rows.Add()
            newRow.ItemArray = currentRow

        Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
            MsgBox("Line " & ex.Message & 
            " is invalid.  Skipping")
        End Try
    End While
End Using

Puedes encontrar un ejemplo en la documentación, y es importante saber que por convención un archivo .CSV (Comma separated value) debe tener esta estructura para sea considerado como tal:

a, Elenasys , 12345
b, Ronnie, 12345
c, Doru, 534543
d, Hassan, 6234234
e, Haris K., 78345345

Este sería un ejemplo de como convertir los valores obtenidos de un .csv a DataTable

    Dim lines = IO.File.ReadAllLines("C:patharchivo.csv")
    Dim dTable = New DataTable
    Dim numeroColumnas = lines.First.Split(","c).Length
    For i As Int32 = 1 To numeroColumnas
        'Agrega columnas a DataTable.
        dTable.Columns.Add(New DataColumn("Columna_" & i, GetType(String)))
        Debug.Print("Columna_" & i)
    Next

    '**********************
    For Each line In lines
        Dim objFields = From field In line.Split(","c)
        Dim newRow = dTable.Rows.Add()
        newRow.ItemArray = objFields.ToArray()
        Debug.Print("columna_1: " & objFields.ToArray().GetValue(0).ToString)
        Debug.Print("columna_2: " & objFields.ToArray().GetValue(1).ToString)
        Debug.Print("columna_3: " & objFields.ToArray().GetValue(2).ToString)
    Next

    Debug.Print("finaliza!")

Fuente

Add a Comment

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *