Wie kann ich eine CSV-Datei in eine System.Data.DataTable
laden und die Datentabelle auf der Grundlage der CSV-Datei erstellen?
Erlaubt die normale ADO.net-Funktionalität dies?
Ich habe den Anbieter OleDb
verwendet. Er hat jedoch Probleme, wenn Sie Zeilen mit numerischen Werten einlesen, diese aber als Text behandelt werden sollen. Sie können dieses Problem jedoch umgehen, indem Sie eine "schema.ini"-Datei erstellen. Hier ist die von mir verwendete Methode:
// 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;
}
}
Hier finden Sie eine ausgezeichnete Klasse, die CSV-Daten in eine Datentabelle kopiert und dabei die Struktur der Daten verwendet, um die DataTable zu erstellen:
Ein portabler und effizienter generischer Parser für Flat Files
Er ist leicht zu konfigurieren und einfach zu benutzen. Ich empfehle Ihnen, einen Blick darauf zu werfen.
Hier ist eine Lösung, die den ODBC-Texttreiber von ADO.Net verwendet:
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
Nach dem Ausfüllen können Sie Eigenschaften der Datentabelle, wie ColumnName, bewerten, um alle Möglichkeiten der ADO.Net-Datenobjekte zu nutzen.
In VS2008 können Sie Linq verwenden, um denselben Effekt zu erzielen.
HINWEIS: Dies kann ein Duplikat von dieser SO Frage sein.