我知道这个话题做得太烂了,但是我真的是无计可施。
我需要解析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.
我正在考虑扔掉所有的代码,从头开始。我做错了什么吗?
您应该在连接字符串中只指示目录名。文件名将用于查询:
var filename = @"c:worktest.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:FullPathTo].ANSICodedCommaSeparatedText.csv;