2010-07-22 39 views
6

Estoy trabajando en un proyecto y necesito leer un archivo CSV y luego llenar un DataSet con sus datos. He estado buscando y he encontrado algunas cosas interesantes en OleDB.Creando una DataTable desde el archivo CSV

Tengo un CSVReader clase:

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

Y me llaman desde aquí:

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

El problema es que se analice la primera línea (la línea de cabecera) como apenas un identificador para la columna, quiero decir: Este es el encabezado del archivo CSV:

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

Y después de él, no todos los datos separado por comas.

Cuando leo el archivo, llene el conjunto de datos e imprima dt.Columns.Count que muestra que solo tiene 1 columna.

¿Algún ayuda?

Gracias de antemano.

+0

posible duplicado de [Cómo leer un archivo csv en una tabla de datos .NET] (http: // stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable) –

+0

Mi solución es la misma que Jim Scott (http://stackoverflow.com/questions/1050112/ how-to-read-a-csv-file-into-a-net-datatable/1050278 # 1050278), pero no funciona: S –

Respuesta

7

siempre uso esta biblioteca CSV para la lectura de archivos CSV a través de C# es siempre funcionaba bien para mí.

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

Aquí está un ejemplo de la lectura de un archivo CSF ​​usando la biblioteca

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

Perfecto. Esto funcionó muy bien. Gracias! –

+0

Me gusta esta biblioteca. – noelicus

1

si nada especial yo uso este tipo de código

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

Muy limpio, muy ligero, ¡bien hecho! –

+0

-1. Dividir por nueva línea no es cómo debe abordar el análisis CSV. Si fuera así de simple, no habrá bibliotecas por ahí. – Neolisk

0

intente incluir IMEX de las propiedades extendidas, que le dirá al conductor que se han mezclado los datos del modo

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

KBCsv tiene soporte incorporado para leer en un DataSet:

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

La mejor opción que he encontrado, y resuelve los problemas donde puede tener diferentes versiones de Office instaladas, y también problemas de 32/64 bits, es FileHelpers.

Puede ser agregado a las referencias del proyecto utilizando NuGet y proporciona una solución de una sola línea:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true); 
Cuestiones relacionadas