string: problema al leer archivos CSV VB.Net en la lista, falta la mitad de los valores

CorePress2024-01-24  10

He estado intentando leer archivos CSV que contienen datos numéricos que constan de 1000 filas para cada una de las 19 columnas dentro de los archivos. He tenido éxito con mi código actual al leer cada columna en un archivo individual y agregar los valores a una lista de decimales, pero recibo un error de usuario interesante que parece que no puedo entender. La lista de salida solo agrega la mitad de los valores del archivo CSV, de modo que dividir a la mitad el rango de filas especificado en el segundo bucle for parece reducir a la mitad la cantidad de valores generados (es decir, 1000 filas especificadas en el bucle for dan como resultado 500 valores en el resultado). lista, 500 filas dan como resultado 250 valores en la lista de resultados). El código se llama desde una función con la ruta del archivo como argumento representado por filePath:

'''

    If My.Computer.FileSystem.FileExists(filePath) = False Then 'What to do if the file does not exist at the specified path
        Throw New Exception("File Not Found: " & filePath) 'Error message if file does not exist
    ElseIf My.Computer.FileSystem.FileExists(filePath) = True Then 'What to do if the file does exist at the specified path
        Dim fileData = IO.File.ReadAllLines(filePath)
        Dim fileColumnCount = (fileData.First.Split(","c).Length) - 1
        Dim fileRowCount = fileData.Length
        Dim column As Integer
        Dim row As Integer
        Dim currentColumn As New List(Of Decimal)
        column = 0
        For column = 0 To fileColumnCount
            row = 0
            currentColumn.Clear()
            For row = 0 To (fileRowCount - 1)
                Dim placeholder As String = fileData(row)
                Dim currentLine() As String = placeholder.Split(",")
                Dim lineList As List(Of String) = currentLine.ToList()
                Dim value_dec As Decimal = Convert.ToDecimal(lineList(column))
                currentColumn.Add(value_dec)
                row += 1
            Next
            column += 1
        Next
    End If
End Function

'''

Cuando reviso currentColumn (la lista de salida para una columna individual dentro del archivo CSV) después de ejecutar el programa con un punto de interrupción antes de reiniciar el primer bucle for, de modo que solo se verifica la primera columna, solo la primera mitad de los valores se agregan. Aunque la fila es igual a 1000, lo que indica que se ha analizado el valor de cada fila, siempre me falta la mitad de los datos. ¿Alguna idea o consejo? Gracias.

Editar: después de algunas pruebas más, parece que los valores espaciados uniformemente no se incluyen en el conjunto de datos de salida. Todavía no hemos podido solucionar el problema.

1

Cuando analiza archivos CSV, normalmente realiza un bucle en las filas y, para cada fila, extrae los valores de sus campos. No de la otra manera. Sugiero usar, al menos, la clase TextFieldParser para analizar un archivo CSV o, probablemente mejor, CsvHelper. -- Cuando solicite ayuda para analizar un texto, siempre debe proporcionar una muestra significativa de ese texto. Mejor agregue también CultureInfo/idioma en uso.

- Jimi

26/03/2021 a las 19:33

Si tuEl problema se ha resuelto, considere aceptar la respuesta correcta.

- Xingyu Zhao

1 de abril de 2021 a las 7:06



------------------------------------

Este pequeño fragmento debería hacerlo todo

For each row in split(csvfiletext, environment.newline)
    dim listviewitem as new listviewitem
    For each column in split(row, ",")
      listviewitem.subitems.add(column)
    Next
    Listview1.items.add(listviewitem)
next

Divide el contenido del archivo en filas y luego en columnas. Y agrega ListViewItems a un ListView mientras recorre el texto.



------------------------------------

No es necesario que la fila agregue 1 en el bucle.

            For row = 0 To (fileRowCount - 1)
                ...
                row += 1
            Next

Eliminar fila += 1:

            For row = 0 To (fileRowCount - 1)
                Dim placeholder As String = fileData(row)
                Dim currentLine() As String = placeholder.Split(",")
                Dim lineList As List(Of String) = currentLine.ToList()
                Dim value_dec As Decimal = Convert.ToDecimal(lineList(column))
                currentColumn.Add(value_dec)
            Next

Su guía para un futuro mejor - libreflare
Su guía para un futuro mejor - libreflare