【问题标题】:.NET writing a delimited text file.NET 编写分隔文本文件
【发布时间】:2009-07-02 22:04:05
【问题描述】:

我正在为我的雇主的一个项目编写一个框架,用于将集合写成不同的格式。一种输出格式是分隔的文本文件(通常称为 CSV——尽管 CSV 并不总是由逗号分隔)。

我正在通过 ADO.net 中的 OleDbConnection 使用 Microsoft.Jet.OLEDB.4.0 提供程序。对于阅读这些文件,它非常快。但是,对于写作来说,它非常缓慢。

在一种情况下,我有一个包含 160 条记录的文件,每条记录大约有 250 个字段。创建此文件大约需要 30 秒,似乎受 CPU 限制。

我完成了以下操作,显着提升了性能,但我想不出其他任何东西:

  1. 准备语句一次
  2. 使用未命名的参数

还有其他建议可以加快速度吗?

【问题讨论】:

  • 肯定需要查看一些代码才能提供任何帮助。我有一些编写 CSV 文件的 C# 代码,但没有看到接近这么低的性能。

标签: c# csv


【解决方案1】:

“不要使用 OleDbConnection”怎么样...用TextWriter 编写分隔文件非常简单(转义)。阅读,CsvReader

【讨论】:

  • 我编写了自己的转义代码和 StreamWriter。现在似乎运行良好......仍然使用 OLEBB 进行阅读,据我所知没有性能问题。
【解决方案2】:

我在我的雇主那里编写了一组简单的小类来做到这一点(写入和读取 CSV 文件或其他具有固定字段长度的平面文件)。 我刚刚使用了 StreamWriter 和 StreamReader 类,实际上速度非常快。

【讨论】:

    【解决方案3】:

    尝试使用 System.Configuration.CommaDelimitedStringCollection,就像这里的代码一样,将对象列表打印到 TextWriter。

    public void CommaSeperatedWriteLine(TextWriter sw, params Object[] list)
    {
        if (list.Length > 0)
        {
            System.Configuration.CommaDelimitedStringCollection commaStr = new System.Configuration.CommaDelimitedStringCollection();
    
            foreach (Object obj in list)
            {
                commaStr.Add(obj.ToString());
            }
    
            sw.WriteLine(commaStr.ToString());
        }
    }
    

    【讨论】:

      【解决方案4】:

      看看代码项目中的这个 LINQ to CSV 库: http://www.codeproject.com/KB/linq/LINQtoCSV.aspx

      我还没有使用过这个,但我已经在我的参考文件中使用它大约一年了。

      “这个库可以很容易地使用 CSV 文件和 LINQ 查询。”

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2010-10-14
        • 2017-05-05
        • 1970-01-01
        • 2012-06-23
        • 2021-05-14
        • 1970-01-01
        • 1970-01-01
        • 2021-12-07
        相关资源
        最近更新 更多