C# 使用OleDb和C解析CSV#

C# 使用OleDb和C解析CSV#,c#,parsing,csv,oledb,oledbconnection,C#,Parsing,Csv,Oledb,Oledbconnection,我知道这个话题已经谈得不可开交了,但我却束手无策 我需要解析csv。这是一个相当普通的CSV,解析逻辑是由另一个开发人员使用OleDB编写的,他在休假前发誓它可以工作:) 我遇到的问题是,根据我尝试的连接字符串,我会出现各种错误 当我尝试连接字符串时: Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited" Provider=Micro

我知道这个话题已经谈得不可开交了,但我却束手无策

我需要解析csv。这是一个相当普通的CSV,解析逻辑是由另一个开发人员使用OleDB编写的,他在休假前发誓它可以工作:)

我遇到的问题是,根据我尝试的连接字符串,我会出现各种错误

当我尝试连接字符串时:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited"
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0;
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""
我得到一个错误:

'D:\TEST.csv' is not a valid path.  Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.
External table is not in the expected format.
当我尝试连接字符串时:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited"
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0;
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""
或连接字符串

Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=Excel 8.0;
我得到一个错误:

'D:\TEST.csv' is not a valid path.  Make sure that the path name is spelled correctly and that you are connected to the server on which the file resides.
External table is not in the expected format.

我正在考虑扔掉所有的代码,从头开始。是否有明显的错误?

您的第一行似乎包含列名,因此需要包括HDR=YES属性,如下所示:

Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties="Excel 12.0;HDR=YES";

请尝试连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:\TEST.csv\";Extended Properties="text;HDR=No;FMT=Delimited"
Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\TEST.csv;Extended Properties=Excel 12.0;
"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\TEST.csv;Extended Properties=\"Excel 8.0;IMEX=1\""

您应该只在连接字符串中指明目录名。文件名将用于查询:

var filename = @"c:\work\test.csv";
var connString = string.Format(
    @"Provider=Microsoft.Jet.OleDb.4.0; Data Source={0};Extended Properties=""Text;HDR=YES;FMT=Delimited""", 
    Path.GetDirectoryName(filename)
);
using (var conn = new OleDbConnection(connString))
{
    conn.Open();
    var query = "SELECT * FROM [" + Path.GetFileName(filename) + "]";
    using (var adapter = new OleDbDataAdapter(query, conn))
    {
        var ds = new DataSet("CSV File");
        adapter.Fill(ds);
    }
}

您可以使用(或)代替OleDB。

另一种解决方案是使用TextFieldParser类(作为.Net framework本身的一部分)

这样你就不必依赖其他度假的开发者了。我已经用过很多次了,没有遇到任何障碍


我在工作中发布了这篇文章(因此我无法发布示例代码段。我将在今晚回家时发布)。

是的,第一列是标题<代码>外部表未采用预期格式。stillnops
外部表未采用预期格式。
still…:)这使我克服了上面提到的两个错误,但由于我们直接查看目录,如何指定要拾取的文件?它崩溃并告诉我Microsoft Jet数据库引擎找不到对象“TEST$.txt”。确保该对象存在,并且正确拼写其名称和路径名。我非常感谢您!你能给我指一些像样的csv解析器吗?另外,在哪里可以读取连接字符串?现在对我来说,这就像伏都教一样。@Zulfi Tapia,在我的答案末尾,我已经向你指出了两个不错的CSV解析器。我建议了另一个替代CSV解析器,它也是微软的。请参阅下面我的答案,它以“备用解决方案…”开头,文件名中有空格。感谢您提供简单、干净的解决方案!一个简短的例子将是对这个答案的一个很好的补充。@Carol-我会这么做的。我一定是在工作时发布了答案,因此无法发布示例。“今天晚上我回家的时候我会这样做的。”卡罗尔,周围有很多人。是我不久前在这里发布的一个。