【问题标题】:Merging 2 Text Files in C#在 C# 中合并 2 个文本文件
【发布时间】:2012-11-30 03:38:40
【问题描述】:

首先,我想提一下,我几天前才开始学习C#,所以我对它的了解有限。

我正在尝试创建一个程序,该程序将针对用户输入的某些短语解析文本文件,然后将它们输出到新的文本文档中。

目前,我让程序搜索原始输入文件并收集用户输入的选定文本,处理这些行,创建新的文本文件,然后将它们合并在一起,然后删除它们。

我猜这不是创建它的最有效方式,但我只是创建了它,并让它在一个合乎逻辑的庄园中工作,让我作为一个新手理解。

代码如下;

private void TextInput1()
    {
        using (StreamReader fileOpen = new StreamReader(txtInput.Text))
        {
            using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                string file;
                while ((file = fileOpen.ReadLine()) != null)
                {
                    if (file.Contains(txtFind.Text))
                    {
                            fileWrite.Write(file + "\r\n");
                    }
                }
            }
        }
    }

    private void TextInput2()
    {
        using (StreamReader fileOpen = new StreamReader(txtInput.Text))
        {
            using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                string file;
                while ((file = fileOpen.ReadLine()) != null)
                {
                    if (file.Contains(txtFind2.Text))
                    {
                        fileWrite.Write("\r\n" + file);
                    }
                }
            }
        }
    }

    private static void Combination()
    {
        ArrayList fileArray = new ArrayList();

        using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
        {

            using (StreamReader reader = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                writer.Write(reader.ReadToEnd());
            }

            using (StreamReader reader = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                writer.Write(reader.ReadToEnd());
            }
        }

    }

    private static void Delete()
    {
        if (File.Exists(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                File.Delete(@"*DIRECTORY*\FIRSTFILE.txt");
            }

        if (File.Exists(@"*DIRECTORY*\SECONDFILE.txt"))
            {
                 File.Delete(@"*DIRECTORY*\SECONDFILE.txt");
            }

    }

正在创建的输出文件只是输出第一个文本输入,然后输出第二个。我想知道是否有可能将它们合并到 1 个文件中,一次 1 行,因为它是一个连续的文件,这意味着需要来自输入 1 的信息,然后是 2,而不是全部 1,然后是全部 2。

谢谢,尼尔。

【问题讨论】:

  • 所以,如果我理解正确的话,你想从第一个文件开始写一行,然后从第二个文件开始写一行,依此类推。对吗?
  • 你可能想让你的问题更清楚,因为从给出的答案中,我想,对你的愿望有不同的理解。您是否想要:并行读取两个文件并将输出并行输出到单个文件中,而无需 merge 两个不同的输出文件?这是可能的(而且不是太难),尽管您可能会认为并行读取 2 个文件(位于同一硬盘驱动器上)通常不会比顺序读取 2 个文件快 2 倍。如果你不走运,它会慢得多。
  • 对不起,如果我没有说清楚。 @Steve 有正确的想法。创建 2 个文件后,一次合并 1 行,即 I.E.第 1 行 - 文件 1,第 1 行 - 文件 2,第 2 行 - 文件 1,第 2 行 - 文件 2。

标签: c# file merge


【解决方案1】:

试试这个方法。您可以收到三个路径。文件 1、文件 2 和文件输出。

public void MergeFiles(string pathFile1, string pathFile2, string pathResult)
{
    File.WriteAllText(pathResult, File.ReadAllText(pathFile1) + File.ReadAllText(pathFile2));
}

如果pathResult 文件存在,WriteAllText 方法将覆盖它。记得包含 System.IO 命名空间。

重要提示:不建议用于大文件!使用此线程上可用的其他选项。

【讨论】:

  • 对于非常大的文件,您将使用 1 x WriteAlltext(),然后其他使用 AppendAlltext()
  • Henk,谢谢你的提示。对于非常大的文件,在 StringBuilder 中加载所有内容并使用 1x WriteAllText 方法输出是一个不错的做法?
  • 不,StringBuilder 将具有(几乎)相同的内存压力。
【解决方案2】:

要将两个文件的内容逐行合并到一个合并的文件中,您可以用这个替换您的 Combination() 代码

string[] file1 = File.ReadAllLines("*DIRECTORY*\FIRSTFILE.txt");
string[] file2 = File.ReadAllLines("*DIRECTORY*\SECONDFILE.txt");

using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
{
    int lineNum = 0;
    while(lineNum < file1.Length || lineNum < file2.Length)
    {
        if(lineNum < file1.Length)
            writer.WriteLine(file1[lineNum]);
        if(lineNum < file2.Length)
            writer.WriteLine(file2[lineNum]);
        lineNum++;
    }
}

这假设两个文件不包含相同数量的行。

【讨论】:

  • 那段代码运行得非常完美,就像史蒂夫一样,工作起来就像一个魅力。
  • 性能会受到影响,因为您将所有数据读入字符串。相反,您可以创建第一个文件的副本,然后将第二个文件附加到其中,而不是将两个文件数据保存到内存中,您有只保留一个
【解决方案3】:

如果您的输入文件很大并且内存不足,您也可以尝试像这样包装两个阅读器:

        using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
        {
            using (StreamReader reader1 = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
            {
                using (StreamReader reader2 = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
                {
                    string line1 = null;
                    string line2 = null;
                    while ((line1 = reader1.ReadLine()) != null)
                    {
                        writer.WriteLine(line1);
                        line2 = reader2.ReadLine();
                        if(line2 != null)
                        {
                            writer.WriteLine(line2);
                        }
                    }
                }
            }
        }

不过,您必须知道输入文件中有多少行,但我认为它为您提供了继续进行的总体思路。

【讨论】:

    【解决方案4】:

    使用FileInfo 扩展,您可以通过以下操作合并一个或多个文件:

    public static class FileInfoExtensions
    {
      public static void MergeFiles(this FileInfo fi, string strOutputPath , params string[] filesToMerge)
      {
        var fiLines = File.ReadAllLines(fi.FullName).ToList();
        fiLines.AddRange(filesToMerge.SelectMany(file => File.ReadAllLines(file)));
        File.WriteAllLines(strOutputPath, fiLines.ToArray());
      }
    }
    

    用法

      FileInfo fi = new FileInfo("input");
      fi.MergeFiles("output", "File2", "File3");
    

    【讨论】:

      【解决方案5】:

      我很欣赏这个问题几乎足以(向上)投票(本身),但对于一种可扩展的方法:

      const string FileMergeDivider = "\n\n";
      
      public void MergeFiles(string outputPath, params string[] inputPaths)
      {
          if (!inputPaths.Any())
              throw new ArgumentException(nameof(inputPaths) + " required");
      
          if (inputPaths.Any(string.IsNullOrWhiteSpace) || !inputPaths.All(File.Exists))
              throw new ArgumentNullException(nameof(inputPaths), "contains invalid path(s)");
      
          File.WriteAllText(outputPath, string.Join(FileMergeDivider, inputPaths.Select(File.ReadAllText)));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-01-20
        • 2019-02-06
        • 2016-11-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-11-08
        相关资源
        最近更新 更多