C# c读取csv文件时给出的路径无效

C# c读取csv文件时给出的路径无效,c#,csv,oledb,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

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


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

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

fullFilename = System.IO.Path.Combine(folderfilepath, Filename);
在您的示例中:

var fileName = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, @"Uploads\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中指定文件名。这是一种多么奇怪的方式啊。现在对我有用了

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

\\computerName\shareName\path\

几周前,我在尝试实现Office2007自动化时遇到了同样的问题,花了太多时间试图解决它

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

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

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

最容易使用,IMO 易于使用,适用于大型数据集 库灵活,包括代码生成器,有点学习曲线

通常,这些将允许您指定CSV分隔符、标题、文本限定符等的属性,并通过方法调用将CSV转储到某种类型的数据结构中,如数据表或列表


如果您要使用CSV,请查看CSV解析器。

如果您只是尝试使用C读取CSV文件,最简单的方法是使用该类。它实际上内置在.NET框架中,而不是作为第三方扩展

是的,它在Microsoft.VisualBasic.dll中,但这并不意味着不能从C或任何其他CLR语言中使用它

下面是一个使用示例,摘自:


同样,这个例子在VB.NET中,但是将它翻译成C是很简单的。

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


另外请注意,如果使用Microsoft Jet OLEDB驱动程序读取CSV文件,则无法读取任何文件名中有多个点的CSV文件。也就是说,filename.csv将起作用,但file.name.csv将不起作用。请注意,您希望使用sql=SELECT*FROM myfile.csv,即filename不带路径。您可以使用csvFile=RightcsvPath、LencsvPath-instrevcspath、\@TommyO'Dell或path.getfilenamecsvpath从完整路径中提取文件名,效果非常好!非常感谢。正是我错过的。谢谢@这不是你唯一的问题,但这是很好的建议。切勿将路径操作作为字符串-始终使用System.IO.path helper函数。否则,总会有一种边缘情况困扰着你。我使用了快速CSV阅读器,它很棒。虽然我同意使用CSV解析器可能是最好的解决方案,但我的答案可能已经内置到了.NET Framework中,使用Microsoft Jet OLEDB驱动程序可能是有用的。一个有用的属性是,它可以检测CSV列的数据类型,我过去在编写代码将CSV文件转换为不同格式的DBF时使用过这些数据类型。@Daniel-OLEDB provider很有趣,我不知道这一点。我不确定我是否想使用这个特性,我更喜欢自己显式地设置和检查这些东西。谢谢你的信息。
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