2010-07-22 17 views
6

Sto lavorando a un progetto e ho bisogno di leggere un file CSV e quindi riempire un DataSet con i suoi dati. Ho cercato e ho trovato alcune cose interessanti in OleDB.Creazione di un DataTable dal file CSV

Ho una classe CSVReader:

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]; 
    } 
} 

E mi chiamano da qui:

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

Il problema è che analizzare la prima riga (riga di intestazione) come solo un identificatore per la colonna, voglio dire: Questa è l'intestazione del file CSV:

Name, Product Name, Server, Vendor, Start Time, End Time, Host Name, User Name, Project Name, Usage time (hours) 

E dopo, c'è tutti i dati separati da virgole.

Quando ho letto il file, riempi il set di dati e stampo dt.Columns.Count mostra che ha solo 1 colonna.

Qualsiasi aiuto?

Grazie in anticipo.

+0

possibile duplicato di [Come leggere un file CSV in un .net datatable] (http: // stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable) –

+0

La mia soluzione è la stessa di Jim Scott (http://stackoverflow.com/questions/1050112/ how-to-read-a-csv-file-in-a-net-datatable/1050278 # 1050278), ma non funziona: S –

risposta

7

Io uso sempre questa libreria CSV per la lettura di file CSV attraverso C# la sua sempre lavorato bene per me.

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

Ecco un esempio di lettura di un file CSF utilizzando la libreria

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

Perfetto. Questo ha funzionato alla grande. Grazie! –

+0

Come questa libreria. – noelicus

1

se niente di speciale io uso questo tipo di codice

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

Molto pulito, molto leggero - ben fatto! –

+0

-1. La suddivisione in una nuova riga non è come dovresti avvicinarti all'analisi CSV. Se fosse così semplice, non ci saranno librerie là fuori. – Neolisk

0

Prova compreso IMEX nelle proprietà estese, che dirà al driver che si sono mescolati i dati in modalità

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

KBCsv ha il supporto integrato per la lettura in un DataSet:

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

L'opzione migliore che ho trovato e risolve i problemi in cui è possibile che siano installate versioni diverse di Office e anche problemi a 32/64 bit, è FileHelpers.

Può essere aggiunto ai riferimenti del progetto utilizzando NuGet e fornisce una soluzione one-liner:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true); 
Problemi correlati