【问题标题】:c# reading csv file gives not a valid pathc#读取csv文件给出的路径不是有效的
【发布时间】:2010-11-30 07:02:35
【问题描述】:

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

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

【问题讨论】:

    标签: c# csv oledb


    【解决方案1】:

    好的,我挖得更远了,看来我的连接字符串是错误的。对于 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 中指定文件名。这是多么奇怪的做法。它现在对我有用。

    【讨论】:

    • 另请注意,如果您使用 Microsoft Jet OLEDB 驱动程序读取 CSV 文件,您将无法读取文件名中包含多个点的任何 CSV 文件。也就是说,“filename.csv”会起作用,但“file.name.csv”不会。
    • 并注意您要使用sql = SELECT * FROM myfile.csv(即没有路径的文件名)。您可以使用 csvFile = Right(csvPath, Len(csvPath) - InStrRev(csvPath, "\")) 从完整路径中提取文件名
    • @TommyO'Dell 或干脆Path.GetFileName(csvPath)
    • 完美运行!谢谢!
    • 正是我所缺少的。谢谢!
    【解决方案2】:

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

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

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

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

    如果您将使用 CSV,那么值得一试 CSV 解析器。

    【讨论】:

    • 我用过“Fast CSV Reader”,很棒。
    • 虽然我同意使用 CSV 解析器可能是最好的解决方案(请参阅我的答案以了解实际已内置于 .NET Framework 中的替代方案),但在某些情况下可能会使用 Microsoft Jet OLEDB司机很有用。一个有用的属性是它可以检测 CSV 列的数据类型,我过去在编写代码以将 CSV 文件转换为不同格式(在我的例子中为 DBF)时使用过。
    • @Daniel - 对 OLEDB 提供商很感兴趣,我不知道。我不确定我是否想使用这个功能,我更喜欢自己明确设置(和检查)这些东西。感谢您的信息。
    【解决方案3】:

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

    fullFilename = System.IO.Path.Combine(folderfilepath, Filename);
    

    在你的例子中:

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

    【讨论】:

    • @seanlinmt:这不是您唯一的问题,但这是非常合理的建议。 从不将路径操作作为字符串进行 - 始终使用 System.IO.Path 辅助函数。否则,总会有一个边缘情况让你感到困扰。
    【解决方案4】:

    如果您只是尝试使用 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# 将是微不足道的。

    【讨论】:

      【解决方案5】:

      几周前我在尝试执行 Office 2007 自动化时遇到了同样的问题,并且花了太多时间尝试修复它。

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

      【讨论】:

        【解决方案6】:

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

        \\computerName\shareName\path\
        

        【讨论】:

          【解决方案7】:

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

          CsvReader

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2013-02-12
            • 2020-11-27
            • 1970-01-01
            • 2016-12-27
            • 1970-01-01
            • 2017-04-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多