Hvordan kan jeg laste en CSV-fil inn i en System.Data.DataTable
og opprette datatabellen basert på CSV-filen?
Tillater den vanlige ADO.net-funksjonaliteten dette?
Jeg har brukt OleDb
-leverandøren. Den har imidlertid problemer hvis du leser inn rader som har numeriske verdier, men du vil at de skal behandles som tekst. Du kan imidlertid omgå dette problemet ved å opprette en schema.ini
-fil. Her er metoden jeg brukte:
// 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;
}
}
Her er en utmerket klasse som kopierer CSV-data til en datatabell ved hjelp av datastrukturen for å opprette DataTable:
En portabel og effektiv generisk parser for flate filer.
Den er enkel å konfigurere og enkel å bruke. Jeg oppfordrer deg til å ta en titt.
Her er en løsning som bruker ADO.Net's ODBC-tekstdriver:
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
Når den er fylt, kan du verdsette egenskaper i datatabellen, for eksempel ColumnName, for å utnytte alle mulighetene i ADO.Net-dataobjektene.
I VS2008 kan du bruke Linq for å oppnå samme effekt.
MERK: Dette kan være en kopi av dette SO-spørsmålet.