【问题标题】:Issues in with line end when writing multiple files into one file with C#使用 C# 将多个文件写入一个文件时出现行结束问题
【发布时间】:2013-02-04 10:48:17
【问题描述】:

我正在尝试将 4 组 15 个 txt 文件写入 4 个大 txt 文件,以便更容易导入到另一个应用程序中。

这是我的代码:

using System;
using System.IO;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace AggregateMultipleFiles
{
    class AggMultiFilestoOneFile
    {/*This program can reduce multiple input files and grouping results into one file for easier app loading.*/
    static void Main(string[] args)
    {

        TextWriter writer = new StreamWriter("G:/user/data/yr2009/fy09_filtered.txt");  
        int linelen =495; 
        char[] buf = new char[linelen];
        int line_num = 1;

        for (int i = 1; i <= 15; i++)
        {
                TextReader reader = File.OpenText("G:/user/data/yr2009/fy09_filtered"+i+".txt"); 
            while (true)
            {
                int nin = reader.Read(buf, 0, buf.Length);
                if (nin == 0 )
                {
                    Console.WriteLine("File ended");
                    break;
                }
                writer.Write(new String(buf));

                line_num++;
            }
            reader.Close();

        }
        Console.WriteLine("done");
        Console.WriteLine(DateTime.Now);
        Console.ReadLine(); 
        writer.Close();

    }
  }
}

我的问题出在调用文件末尾的某个地方。它没有完成文件的最后一行的写入,然后在前一个文件的最后一行的中间开始写入下一个文件的第一行。

这会丢弃它导入的应用程序中的所有列和数据。

有人建议我可能需要在 15 个文件的每一行的末尾用回车符和回车符填充,\r\n。

  1. 为什么我的东西不起作用?
  2. 填充可以代替吗?我该怎么写?

谢谢!

【问题讨论】:

  • 您知道您可以将文本文件与命令提示符“复制”命令一起附加,对吧?
  • 不,但我当然愿意尝试!每个文件包含大约 100 万行信息,我害怕丢失任何信息。那会安全吗?
  • 自 DOS 时代(80 年代)就已经存在。我很确定他们已经解决了大部分主要故障。
  • 它并没有像我预期的那样附加到 fy09_filtered1.txt 中。我做了前 4 个测试:COPY G:/user/data/yr2009/fy09_filtered1.txt+fy09_filtered2.txt+fy09_filtered3.txt+fy09_filtered4.txt

标签: c# file-io streamwriter


【解决方案1】:

我强烈怀疑这是问题所在:

writer.Write(new String(buf));

您总是从buf所有 个字符创建一个字符串,而不仅仅是第一个nin 字符。如果您的任何文件都很短,您最终可能会得到“空”Unicode 字符(即 U+0000),这在某些应用程序中可能被视为字符串终止符。

甚至不需要创建一个字符串 - 只需使用:

writer.Write(buf, 0, nin);

(顺便说一句,我还强烈建议使用using 语句而不是手动调用Close。)

还值得注意的是,没有任何东西可以保证您一次真正阅读一行。您不妨将缓冲区大小增加到 32K 左右,以便以可能更少的块读取文件。

此外,如果文件足够小,您可以将每个文件完全读入内存,这将使您的代码更简单:

using (var writer = File.CreateText("G:/user/data/yr2009/fy09_filtered.txt"))
{
    for (int i = 1; i <= 15; i++)
    {
        string inputName = "G:/user/data/yr2009/fy09_filtered" + i + ".txt";
        writer.Write(File.ReadAllText(inputName));
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多