我正在尝试将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。
谢谢!
答案 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));
}
}