如何使用c#读取CSV文件

时间:2010-05-07 06:47:31

标签: c# csv

我正在阅读csv文件并创建数据集。

string MyPath = System.IO.Path.GetDirectoryName(Filename);
string ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + MyPath + ";Extended Properties='text;HDR=Yes;FMT=Delimited'";
//string CmdText = "select * from JDL-NurseryParts" + System.IO.Path.GetFileName(Filename);
string CmdText = "select * from ABC";
OleDbConnection Con = new OleDbConnection(ConnectionString);
OleDbDataAdapter adptr = new OleDbDataAdapter(CmdText, Con);
DataSet Ds = new DataSet();
adptr.Fill(Ds);
return Ds;

我收到错误“语法错误附近”。当我打开那个csv文件时,它包含workedsheet。

文件名 - ABC

工作表名称 - ABC

我正在使用c#

2 个答案:

答案 0 :(得分:2)

在我目前的项目中,我使用File Helpers,我没有失望!

编辑:作为一个简单的例子,这里是我正在使用的一个类。一切都与属性有关。 (样本在VB.Net中,但你会得到这个想法)

<DelimitedRecord(";")> _
<IgnoreFirst(1)> _
<IgnoreEmptyLines()> _
Public Class ClientsClass            
    <FieldConverter(ConverterKind.Date, "dd/M/yyyy"), FieldQuoted(QuoteMode.OptionalForBoth)> Public DateField As Date
    <FieldTrim(TrimMode.Both), FieldQuoted(QuoteMode.OptionalForBoth)> Public ClientCountry As String
    <FieldTrim(TrimMode.Both), FieldQuoted(QuoteMode.OptionalForBoth)> Public AccountId As String
    <FieldTrim(TrimMode.Both), FieldQuoted(QuoteMode.OptionalForBoth)> Public Name As String
    <FieldTrim(TrimMode.Both), FieldQuoted(QuoteMode.OptionalForBoth)> Public FNumber As String
End Class

所以基本上,你创建一个类,其中每个字段都是你的CVS文件中的一个字段(顺序很重要),然后你添加了一些属性,它们将告诉必须对字段应用什么样的处理(例如修剪,转换, ...)。您还可以添加类属性,例如<DelimitedRecord(";")>,它告诉文件中使用哪个分隔符,或IgnoreFirst(1),它告诉引擎不解析第一行。每个属性都在他们的文档中进行了解释,网站上有许多样本供您学习。

然后,将文件解析为类非常简单:

Dim filePath as string = "Path to your file.csv"
Dim fhe As New FileHelperEngine(Of ClientsClass)
Dim vals as ClientClass() = CType(fhe.ReadFile(filePath), ClientClass())

你得到一个数组,每个解析的行包含1个ClientClass个对象。

请注意,他们还构建了一个工具,可以帮助您创建课程,可以在他们的网站上下载。

答案 1 :(得分:0)

我认为你的CmdText字符串可能有问题。试试

string CmdText = "SELECT * FROM [" + System.IO.Path.GetDirectoryName(Filename) + "]";

我使用下面的类来读取CSV文件,它似乎运行良好(返回一个DataTable,但你可以轻松地返回一个DataSet:

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

希望它有所帮助: - )