1

我正在尝试将 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. 填充会起作用吗?我该怎么写?

谢谢!

4

1 回答 1

4

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

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));
    }
}
于 2013-02-19T16:49:31.063 回答