C#并排合并两个或多个文本文件

标签 c# performance merge

using (StreamWriter writer = File.CreateText(FinishedFile))
{
    int lineNum = 0;
    while (lineNum < FilesLineCount.Min())
    {
        for (int i = 0; i <= FilesToMerge.Count() - 1; i++)
        {
            if (i != FilesToMerge.Count() - 1)
            {
                var CurrentFile = File.ReadLines(FilesToMerge[i]).Skip(lineNum).Take(1);
                string CurrentLine = string.Join("", CurrentFile);
                writer.Write(CurrentLine + ",");
            }
            else
            {
                var CurrentFile = File.ReadLines(FilesToMerge[i]).Skip(lineNum).Take(1);
                string CurrentLine = string.Join("", CurrentFile);
                writer.Write(CurrentLine + "\n");
            }
        }
        lineNum++;
    }
}

我目前这样做的方式太慢了。我将每个 50k+ 行长的文件与不同数量的数据合并。

例如: 文件一
1
2
3
4

文件2
4
3
2
1

我需要这个合并成第三个文件
文件3
1,4
2,3
3,2
4,1

附言用户可以从任何位置选择任意数量的文件。
感谢您的帮助。

最佳答案

由于循环中的 SkipTake,您的方法很慢。

您可以使用字典来收集所有行索引的行:

string[] allFileLocationsToMerge = { "filepath1", "filepath2", "..." };
var mergedLists = new Dictionary<int, List<string>>();
foreach (string file in allFileLocationsToMerge)
{
    string[] allLines = File.ReadAllLines(file);
    for (int lineIndex = 0; lineIndex < allLines.Length; lineIndex++)
    {
        bool indexKnown = mergedLists.TryGetValue(lineIndex, out List<string> allLinesAtIndex);
        if (!indexKnown)
            allLinesAtIndex = new List<string>();
        allLinesAtIndex.Add(allLines[lineIndex]);
        mergedLists[lineIndex] = allLinesAtIndex;
    }
}

IEnumerable<string> mergeLines = mergedLists.Values.Select(list => string.Join(",", list));
File.WriteAllLines("targetPath", mergeLines);

关于C#并排合并两个或多个文本文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50585712/

相关文章:

php - 从一个数组合并多个数组

clojure - 帮助我了解 Clojure 中如何处理不变性和运行时间之间的冲突

c++ - 矩阵乘法 : Strassen vs. 标准

c# - 如何在 TableLayoutPanel 中动态设置单元格颜色?

c# - 打开解决方案/文件时 Visual Studio Professional 2013 崩溃

java - 设置/返回数组的首选方式

objective-c - 合并两个 iOS 核心数据持久存储的有效方法是什么?

c++ - 从 main 创建一个合并两个数组 C++ 的函数

c# - RabbitMQ C# 验证消息已发送

c# - 在 C#/WPF 中发生特定事件时强制窗口闪烁