2010-07-22 7 views
6

Je travaille sur un projet et je dois lire un fichier CSV, puis remplir un DataSet avec ses données. J'ai cherché et j'ai trouvé des choses intéressantes dans OleDB.Création d'un DataTable à partir d'un fichier CSV

J'ai un CSVReader de classe:

class CSVReader 
{ 
    public DataTable GetDataTable(string filePath) 
    { 
     OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""); 
     conn.Open(); 
     string strQuery = "SELECT * FROM [" + Path.GetFileName(filePath) + "]"; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conn); 
     DataSet ds = new System.Data.DataSet("CSV File"); 
     adapter.Fill(ds); 
     return ds.Tables[0]; 
    } 
} 

Et je l'appelle d'ici:

CSVReader datareader = new CSVReader(); 
DataTable dt = datareader.GetDataTable(filepath); 

Le problème est qu'il parse la première ligne (la ligne d'en-tête) juste comme un identificateur pour la colonne, je veux dire: Ceci est l'en-tête du fichier CSV:

séparé par des virgules.

Lorsque je lis le fichier, remplis l'ensemble de données et j'imprime dt.Columns.Count il montre qu'il n'a que 1 colonne.

Une aide?

Merci d'avance.

+0

double possible de [Comment lire un fichier csv dans un .net datatable] (http: // stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable) –

+0

Ma solution est la même que Jim Scott (http://stackoverflow.com/questions/1050112/ comment-lire-un-csv-fichier-dans-un-net-datatable/1050278 # 1050278), mais cela ne fonctionne pas: S –

Répondre

7

J'utilise toujours cette bibliothèque CSV pour lire les fichiers CSV dans C# est toujours travaillé bien pour moi.

http://www.codeproject.com/KB/database/CsvReader.aspx

Heres un exemple de lecture d'un fichier CSF en utilisant la bibliothèque

using System.IO; 
using LumenWorks.Framework.IO.Csv; 

void ReadCsv() 
{ 
    // open the file "data.csv" which is a CSV file with headers 
    using (CsvReader csv = 
      new CsvReader(new StreamReader("data.csv"), true)) 
    { 
     int fieldCount = csv.FieldCount; 
     string[] headers = csv.GetFieldHeaders(); 

     while (csv.ReadNextRecord()) 
     { 
      for (int i = 0; i < fieldCount; i++) 
       Console.Write(string.Format("{0} = {1};", 
           headers[i], csv[i])); 

      Console.WriteLine(); 
     } 
    } 
} 
+0

Parfait. Cela a bien fonctionné. Merci! –

+0

Aimer cette bibliothèque. – noelicus

1

si rien de spécial i utiliser ce genre de code

TextReader tr1 = new StreamReader(@"c:\pathtofile\filename",true); 

var Data = tr1.ReadToEnd().Split('\n') 
.Where(l=>l.Length>0) //nonempty strings 
.Skip(1)    // skip header 
.Select(s=>s.Trim()) // delete whitespace 
.Select(l=>l.Split(',')) // get arrays of values 
.Select(l=>new {Field1=l[0],Field2=l[1],Field3=l[2]}); 
+0

Très propre, très léger - bien fait! –

+0

-1. Le fractionnement par newline n'est pas la façon dont vous devriez aborder l'analyse CSV. Si c'était aussi simple, il n'y aurait pas de bibliothèques là-bas. – Neolisk

0

Essayez d'inclure IMEX dans les propriétés étendues, ce qui indique au pilote que vous avez des données en mode mixte

Text;HDR=YES;FMT=Delimited;IMEX=1 
2

KBCsv a un support intégré pour lire dans un DataSet:

using (var reader = new CsvReader(@"C:\data.csv")) { 
    reader.ReadHeaderRecord(); 
    var dataSet = new DataSet(); 
    reader.Fill(dataSet, "csv-data"); 
} 
5

La meilleure option que j'ai trouvé, et il résout les problèmes où vous pouvez avoir plusieurs versions d'Office installée, ainsi que 32/questions 64 bits, est FileHelpers.

Il peut être ajouté à vos références de projet à l'aide NuGet et il fournit une solution one-liner:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true); 
Questions connexes