使用c#使用OleDb解析CSV

本文关键字:使用 CSV 解析 OleDb | 更新日期: 2023-09-27 18:03:29

我知道这个话题做得太烂了,但是我真的是无计可施。

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

CSV sample:
Dispatch Date,Master Tape,Master Time Code,Material ID,Channel,Title,Version,Duration,Language,Producer,Edit Date,Packaging,1 st TX,Last TX,Usage,S&P Rating,Comments,Replace,Event TX Date,Alternate Title
,a,b,c,d,e,f,g,h,,i,,j,k,,l,m,,n,

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

当我尝试连接字符串:

Provider=Microsoft.Jet.OLEDB.4.0;Data Source="D:'TEST.csv'";Extended Properties="text;HDR=No;FMT=Delimited"

我得到错误:

'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.
当我尝试连接字符串时:
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;

我得到错误:

External table is not in the expected format.

我正在考虑扔掉所有的代码,从头开始。我做错了什么吗?

使用c#使用OleDb解析CSV

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

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,你可以使用一个体面的CSV解析器(或另一个)。

另一种解决方案是使用TextFieldParser类(. net框架本身的一部分)https://learn.microsoft.com/en-us/dotnet/api/microsoft.visualbasic.fileio.textfieldparser

这样你就不必依赖其他去度假的开发人员了。我已经用了很多次了,没有遇到任何问题。

我已经从工作中发布了这个(因此我不能发布示例片段)。我今晚回家后会这样做的。

似乎您的第一行包含列名,所以您需要包括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='"Excel 8.0;IMEX=1'""
 var  s=@"D:'TEST.csv";
 string dir = Path.GetDirectoryName(s);
 string sConnection = "Provider=Microsoft.Jet.OLEDB.4.0;"
                       + "Data Source='"" + dir + "'''";"
                       + "Extended Properties='"text;HDR=YES;FMT=Delimited'"";

通过这篇文章,我发现在MS Access中你也可以做

SELECT *
FROM [Text;Hdr=Yes;Database=X:'Full'Path'To'].ANSICodedCommaSeparatedText.csv;