¿Cómo puedo cargar un archivo CSV en un System.Data.DataTable
, creando la tabla de datos basada en el archivo CSV?
¿La funcionalidad regular de ADO.net permite esto?
He estado utilizando el proveedor OleDb
. Sin embargo, tiene problemas si usted está leyendo en las filas que tienen valores numéricos, pero que desea que sean tratados como texto. Sin embargo, puedes evitar este problema creando un archivo schema.ini
. Este es el método que he utilizado:
// using System.Data;
// using System.Data.OleDb;
// using System.Globalization;
// using System.IO;
static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
string header = isFirstRowHeader ? "Yes" : "No";
string pathOnly = Path.GetDirectoryName(path);
string fileName = Path.GetFileName(path);
string sql = @"SELECT * FROM [" + fileName + "]";
using(OleDbConnection connection = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
";Extended Properties=\"Text;HDR=" + header + "\""))
using(OleDbCommand command = new OleDbCommand(sql, connection))
using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
{
DataTable dataTable = new DataTable();
dataTable.Locale = CultureInfo.CurrentCulture;
adapter.Fill(dataTable);
return dataTable;
}
}
Aquí's una excelente clase que copiará los datos CSV en una datatable utilizando la estructura de los datos para crear la DataTable:
Un analizador genérico portátil y eficiente para archivos planos
Es fácil de configurar y de usar. Te animo a que le eches un vistazo.
Esta es una solución que utiliza el controlador de texto ODBC de ADO.Net:
Dim csvFileFolder As String = "C:\YourFileFolder"
Dim csvFileName As String = "YourFile.csv"
'Note that the folder is specified in the connection string,
'not the file. That's specified in the SELECT query, later.
Dim connString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
& csvFileFolder & ";Extended Properties=""Text;HDR=No;FMT=Delimited"""
Dim conn As New Odbc.OdbcConnection(connString)
'Open a data adapter, specifying the file name to load
Dim da As New Odbc.OdbcDataAdapter("SELECT * FROM [" & csvFileName & "]", conn)
'Then fill a data table, which can be bound to a grid
Dim dt As New DataTableda.Fill(dt)
grdCSVData.DataSource = dt
Una vez rellenado, puede valorar propiedades de la datatable, como ColumnName, para hacer uso de todas las facultades de los objetos de datos de ADO.Net.
En VS2008 se puede utilizar Linq para conseguir el mismo efecto.
NOTA: Esto puede ser un duplicado de esta pregunta SO.