我正在处理一个项目,我需要读取一个CSV文件,然后用其数据填充DataSet。我一直在寻找,我在OleDB中找到了一些有趣的东西。
我有一个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];
}
}
我从这里叫它:
CSVReader datareader = new CSVReader();
DataTable dt = datareader.GetDataTable(filepath);
问题是它解析了第一行(标题行),就像列的JUST ONE标识符一样,我的意思是:这是CSV文件的标题:
Name, Product Name, Server, Vendor, Start Time, End Time, Host Name, User Name, Project Name, Usage time (hours)
之后,所有数据都以逗号分隔。
当我读取文件时,填充数据集并打印 dt.Columns.Count ,表明它只有1列。
任何帮助?
提前致谢。
答案 0 :(得分:7)
我总是使用这个CSV库通过C#读取CSV文件,它总是对我有用。
http://www.codeproject.com/KB/database/CsvReader.aspx
以下是使用库
读取CSF文件的示例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();
}
}
}
答案 1 :(得分:6)
我找到的最佳选项,它解决了您可能安装了不同版本的Office以及32/64位问题的问题FileHelpers。
可以使用NuGet将其添加到项目引用中,它提供了一个单行解决方案:
CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true);
答案 2 :(得分:2)
KBCsv内置支持阅读DataSet
:
using (var reader = new CsvReader(@"C:\data.csv")) {
reader.ReadHeaderRecord();
var dataSet = new DataSet();
reader.Fill(dataSet, "csv-data");
}
答案 3 :(得分:1)
如果没什么特别的话 我用 这种代码
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]});
答案 4 :(得分:0)
尝试在扩展属性中包含IMEX,这将告诉驱动程序您有混合模式数据
Text;HDR=YES;FMT=Delimited;IMEX=1