【问题标题】:Parsing CSV file in Windows Server 2008 64 C#在 Windows Server 2008 64 C# 中解析 CSV 文件
【发布时间】:2010-02-22 17:13:08
【问题描述】:

我在 Windows Server 2008 64 位版本中解析 *.CSV 文件时遇到了一些问题。 Jet OLEDB 4.0 不读取 CSV 中显示的标题行的问题。

这意味着,当我尝试访问这样的列之一时:

DataTable tbl = GetCsvData();
string sd = tbl.Rows[0]["id"].ToString();

程序抛出异常,表示该列不属于数据表。

我正在使用以下代码:

public DataTable GetCsvData() {
        FileInfo file = new FileInfo(this.fileName);
        string connectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" +
             "Data Source=" + file.DirectoryName + "\\;" +
             "Extended Properties=\"text;HDR=Yes;FMT=Delimited(;)\";";
        OleDbConnection objConn = new OleDbConnection(connectionString);
        objConn.Open();
        OleDbCommand objCmdSelect = new OleDbCommand(string.Format("SELECT * FROM [{0}]", file.Name), objConn);
        OleDbDataAdapter adp = new OleDbDataAdapter(objCmdSelect);
        DataTable tbl = new DataTable("CSVData");
        adp.Fill(tbl);
        objConn.Close();
        objConn.Dispose();
        return tbl;
    }

如您所见,扩展属性是正确的:“HDR=Yes”,这会强制 Jet 引擎读取 CSV 文件的标题行。

这个问题真的很奇怪,因为我可以在我的开发机器(Windows XP SP3)上读取相同的 CSV 文件,完全没有问题。

我认为这是源自 64 位版本的 Windows server 2008 的问题。

我检查了服务器和本地机器上的 msjet40.dll 文件的版本:

Windows XP SP3 => 4.0.9551
Windows Server 2008 64 bit => 4.0.9755

问题不在于 CSV 文件,而在于 Microsoft 提供的驱动程序(至少我是这么认为的),因为我可以在我的机器上完美地读取 CSV 文件。

有没有办法解决这个问题?我用谷歌搜索了很多,但我找不到任何东西。

谢谢..

【问题讨论】:

  • 你能通过连接到来自两个系统的外部应用程序的数据来验证它是驱动程序吗?例如,Excel 或 SQL 链接查询(您的服务器上可能没有 Excel)。
  • 我的服务器上没有 Excel...这是肯定的...而且我无法验证...谢谢...
  • JET 驱动程序在 64 位模式下不可用。您是否强制您的程序以 32 位模式运行?
  • 是的,我做到了...当我在 64.bit 模式下运行时,Web 应用程序会抛出一个异常,说明 Jet 驱动程序未注册。谢谢。

标签: c# csv


【解决方案1】:

我发现 Jet 驱动程序如此不一致,以至于我通常将 CSV 读取为文本文件。 CSV 相当容易解析,而且我永远不必担心驱动程序问题。

【讨论】:

  • 不要推出自己的解决方案,有经过验证和测试的解决方案(请参阅我的回答)。阅读 CSV 可能比您最初想象的要复杂(请参阅我的回答中的“快速 CSV 阅读器”链接)。
【解决方案2】:

您可能想看看“Fast CSV Reader”或“FileHelpers library”而不是使用 JET OLEDB。

【讨论】:

  • 我去了“Fast CSV Reader”,它工作得很好,解析器现在工作得很好......谢谢......
【解决方案3】:

也许不是一个很好的答案,但如果它是驱动程序,那么您可以使用http://www.filehelpers.com/ 解决它。

【讨论】:

    【解决方案4】:

    为什么不使用TextFieldParserbuilt into .NET 框架?

    是的,伙计们,它是 Microsoft.VisualBasic 的一部分,但它仍然是 .Net 完全受支持的部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-29
      • 1970-01-01
      • 1970-01-01
      • 2010-09-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多