c#读取csv文件不提供有效路径

时间:2009-09-22 04:13:12

标签: c# csv oledb

我似乎无法使用以下连接字符串读取.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 \ Uploads \ countrylist.csv'不是有效路径。确保路径名拼写正确,并且您已连接到文件所在的服务器。

我确认文件在那里。这里发生了什么?

7 个答案:

答案 0 :(得分:56)

好的,我进一步挖了一下,似乎我的连接字符串错了。对于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中指定文件名。这是多么奇怪的做法。它现在对我有用。

答案 1 :(得分:4)

我建议您使用CSV解析器而不是使用OLEDB数据提供程序。

搜索,你会发现许多(免费)候选人。以下是一些对我有用的内容:

A portable and efficient generic parser for flat files(最容易使用,IMO)
A Fast CSV Reader(易于使用,非常适合大型数据集)
FileHelpers库(灵活,包括代码生成器,学习曲线的一点点)

通常,这些将允许您指定CSV的属性(分隔符,标题,文本限定符等),并通过方法调用将CSV转储到某种数据结构,例如DataTable或List<> ;

如果您要使用CSV,那么值得查看CSV解析器。

答案 2 :(得分:2)

组合路径和文件名的方法是使用:

fullFilename = System.IO.Path.Combine(folderfilepath, Filename);
在你的例子中

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\countrylist.csv");

答案 3 :(得分:2)

如果您只是尝试使用C#读取CSV文件,最简单的方法是使用Microsoft.VisualBasic.FileIO.TextFieldParser类。它实际上内置于.NET Framework中,而不是第三方扩展。

是的,它位于Microsoft.VisualBasic.dll,但这并不意味着您无法使用C#(或任何其他CLR语言)。

以下是一个使用示例,取自MSDN documentation

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#是微不足道的。

答案 4 :(得分:1)

几个星期前,我遇到了同样的问题,试图做一些Office 2007自动化,并花了太多时间来修复它。

string connectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1;\"";

答案 5 :(得分:0)

如果D驱动器是映射的网络驱动器,那么您可能需要使用UNC路径:

\\computerName\shareName\path\

答案 6 :(得分:-1)

试试这个,快速CSV阅读器,高效的CSV解析器

CsvReader