使用C#将多个文件写入一个文件时使用行结束的问题

时间:2013-02-19 16:45:19

标签: c# file-io streamwriter

我正在尝试将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. 填充工作会改变吗?我该怎么写呢?
  3. 谢谢!

1 个答案:

答案 0 :(得分:4)

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

writer.Write(new String(buf));

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

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

writer.Write(buf, 0, nin);

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

还值得注意的是, nothing 可以保证您一次只能读一行。您也可以将缓冲区大小增加到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));
    }
}