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