c# - 在 C# 中拆分 CSV 文件的有效方法

标签 c# .net performance linq

我正在尝试根据账单中的电话号码将 300MB 的 CSV 文件形式的大型电信账单分成较小的 block 。

有些电话号码的帐单有 20 行,有些则有 1000 多行,因此它是动态的。首先,我阅读账单并使用 LINQ 按电话号码对它们进行分组,并计算账单包含的 CSV 文件中每个电话号码账单的行数。然后插入列表: split_id ,起始行,结束行。 (起始行从0开始)。

下面的脚本是我用来拆分较小账单的脚本。但这 300MB 有异常多的 7500 个电话号码,即使每个文件都减少到 100KB 以下,处理拆分账单需要很长时间。

    static void FileSplitWriter(List<SplitFile> pList, string info)
    {

        pList.ForEach(delegate(SplitFile per)
        {
            int startingLine = per.startingLine;
            int endingLine = per.endingLine;
            string[] fileContents = File.ReadAllLines(info);
            var query = fileContents.Skip(startingLine - 1).Take(endingLine - (startingLine - 1));
            string directoryPath = Path.GetDirectoryName(info);
            string filenameok = Path.GetFileNameWithoutExtension(info);

            StreamWriter ffs = new StreamWriter(directoryPath + "\\" + filenameok + "_split" + per.id + ".csv");
            foreach (string line in query)
            {
                ffs.WriteLine(line);
            }
            ffs.Dispose();
            ffs.Close();
        });


    }

我的问题是,这个过程是否有可能变得更快/更有效率?按照目前的速度,单独拆分文件需要 3 个小时左右。

最佳答案

看起来这段代码中效率最低的部分是您多次 将整个 300MB 文件读入内存。你应该只需要阅读一次......

  1. 将文件读入一些可枚举的数据结构。
  2. 按电话号码分组。
  3. 遍历每个组并将每个组写入一个文件。

注意:如果您使用的是 .NET 4.0,您可能会通过使用 File.ReadLines()(而不是 ReadAllLines)获得一些内存效率。

关于c# - 在 C# 中拆分 CSV 文件的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8456517/

相关文章:

c - 什么时候可以用宏替换C中的函数?

c# - PrintVisual 打印空页

C#:初始化类变量

c# - 在应用程序中在哪里存储字符串?

c# - 在 C# 中访问交换电子邮件

.net - 寻找实时网络服务器分析包

jquery - 监听器 : OK to run on every page, 或仅在需要它们的页面上初始化?

css - AngularJS 应用程序中的 IE "Style Calculation"性能非常慢

c# - 在 Asp.Net 5 中访问客户端 IP 地址 (REMOTE_ADDR)

c# - 检查变量时,{} 意味着什么?