我似乎无法使用下面的连接字符串来读取.csv文件:
var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\countrylist.csv");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();
它提供了以下错误:
'd:\ arrgh \ arrgh \上传\ countrylist.csv' 不是一个有效的路径。 确保路径名称正确并且您连接到该文件所在的服务器拼写。
我核实,该文件是存在的。 这是怎么回事吗?
好吧,我挖了一个远一点,似乎我的连接字符串是错误的。 使用CSV文件,不指定实际文件名,但它所属的目录,例如。
var fileName = string.Format("{0}{1}", AppDomain.CurrentDomain.BaseDirectory, "Uploads\\");
string connectionString = string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=""text;HDR=YES;FMT=Delimited""", fileName);
OleDbConnection oledbConn = new OleDbConnection(connectionString);
oledbConn.Open();
var cmd = new OleDbCommand("SELECT * FROM [countrylist.csv]", oledbConn);
并指定在SelectCommand中的文件名。 什么做的一种奇怪的方式。 它现在是为我工作。
我建议你使用一个CSV解析器,而不是使用OLEDB数据提供程序。
搜索,你会发现许多(免费)候选人。 这里是为我工作的几个:
对于平面文件的便携式和高效的通用解析器 (最容易使用,IMO)
快速CSV读卡器 (易于使用,非常适合大型数据集)
FileHelpers库(柔性的,包括代码发生器,一个学习曲线的位)
典型地,这些将允许您指定CSV(定界符,标头,文本限定符等)的特性,并用方法打电话给你的CSV被转储到某种,数据的结构,例如一个DataTable或列表<>。
如果您要使用CSV在所有的工作,这是值得一试一个CSV解析器。
为路径和文件名的组合方式是使用:
fullFilename = System.IO.Path.Combine(folderfilepath, Filename);
在您的示例:
var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv");
如果你只是想读取与C#的CSV文件,最简单的办法就是使用Microsoft.VisualBasic.FileIO.TextFieldParser类。 它实际上是建立在.NET Framework中,而不是作为一个第三方扩展。
是的,它是在Microsoft.VisualBasic.dll
,但是,这并不意味着你不能从C#(或任何其他CLR语言)使用它。
下面是使用的例子,取自MSDN文档 :
Using MyReader As New _
Microsoft.VisualBasic.FileIO.TextFieldParser("C:\testfile.txt")
MyReader.TextFieldType = FileIO.FieldType.Delimited
MyReader.SetDelimiters(",")
Dim currentRow As String()
While Not MyReader.EndOfData
Try
currentRow = MyReader.ReadFields()
Dim currentField As String
For Each currentField In currentRow
MsgBox(currentField)
Next
Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
MsgBox("Line " & ex.Message & _
"is not valid and will be skipped.")
End Try
End While
End Using
同样,这个例子是VB.NET,但它是微不足道将其翻译为C#。
我有同样的问题在几个星期前试图做一些Office 2007的自动化,花了太多时间试图修复它。
string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";
如果d驱动器映射网络驱动器,那么你可能需要使用UNC路径:
\\computerName\shareName\path\