【问题标题】:Reading data from a CSV file从 CSV 文件中读取数据
【发布时间】:2014-01-07 03:33:08
【问题描述】:

我正在寻找从 CSV 文件中读取数据的最快方法。我尝试了两种不同的方式。

方法 #1: 将 CSV 文件中的所有行读取到一个数组中,然后迭代该数组:

String[] csv = File.ReadAllLines(@"E:\be.csv");

for (int i = 0; i < csv.Length; i++)
{
    tx.Text = csv[i];
    tx.Refresh();
}

方法#2*:使用StreamReader

StreamReader sr = new StreamReader(new FileStream(@"E:\be.csv");

while (!sr.EndOfStream)
{
    string seg = sr.ReadLine();
    tx.Text = sr.ReadLine();
    tx.Refresh();
}

使用StreamReader 似乎要快很多。是否有更快的方法从 CSV 文件导入数据?

【问题讨论】:

  • 不要尝试自己解析它,只需使用 CSV 解析器,这样您就不需要自己解析字符串,也不需要处理所有奇怪的问题(引号转义,对于例如)并且可以只专注于使用数据。是的,无论何时处理任何文件,您都应该流式传输数据,除非有令人信服的理由不这样做。
  • 快速通常不是您需要担心的 CSV。正确的是。你可能会认为你需要做的只是用逗号分隔,但这会让你进入一个受伤的世界。谷歌一些CSV Parsers
  • 另外,tx 是什么,为什么在循环中刷新它有意义?
  • 在我的真实程序中,我有一个动态变化的输入,所以我添加了一个 Timer.Tick 事件,它每隔几秒就开始再次读取文件,tx 是一个显示数据的文本框我读过的。

标签: c# performance csv


【解决方案1】:

我必须建议可以在 NuGet 中找到的 CsvHelper。昨天第一次使用它,现在将是我的解决方案。

http://www.nuget.org/packages/CsvHelper/

对于什么更快的实际问题,我可能会说只是做File.ReadAllLines(...),但你最好实际尝试设置一个测试来执行这两个选项数百次,看看哪个花费的时间最长.

另外,不要忘记处理您的StreamReader。继续并将其包装在 using 语句中,以便所有内容都可能关闭/处置。

【讨论】:

    【解决方案2】:

    Sebastien Loren 的 Fast CSV Reader on CodeProject 可能是要走的路。

    它实现了IDataReader,主要表现得像一个StreamReader。

    强烈推荐。

    【讨论】:

      【解决方案3】:

      .NET 有一个名为 TextFieldParser 的内置 CSV 解析器。

      【讨论】:

        猜你喜欢
        • 2019-09-17
        • 1970-01-01
        • 2019-05-03
        • 2023-03-04
        • 2018-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多