C# 使用C将多个文件写入一个文件时,行结束出现问题#
我正在尝试将4组15个txt文件写入4个大型txt文件,以便更容易导入其他应用程序 这是我的密码:C# 使用C将多个文件写入一个文件时,行结束出现问题#,c#,file-io,streamwriter,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 redu
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();
}
}
}
使用系统;
使用System.IO;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
命名空间聚合多个文件
{
类多文件源文件
{/*此程序可以减少多个输入文件,并将结果分组为一个文件,以便更轻松地加载应用程序*/
静态void Main(字符串[]参数)
{
TextWriter writer=newstreamwriter(“G:/user/data/yr2009/fy09_filtered.txt”);
int linelen=495;
char[]buf=新字符[linelen];
int line_num=1;
对于(int i=1;i我强烈怀疑这就是问题所在:
writer.Write(new String(buf));
您总是从所有buf
创建一个字符串,而不仅仅是第一个nin
字符。如果您的任何文件很短,您可能会得到“null”Unicode字符(即U+0000),在某些应用程序中,这些字符可能被视为字符串终止符
甚至不需要创建字符串-只需使用:
writer.Write(buf, 0, nin);
(顺便说一句,我还强烈建议使用使用语句,而不是手动调用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));
}
}
使用(var writer=File.CreateText(“G:/user/data/yr2009/fy09_filtered.txt”))
{
对于(int i=1;i我强烈怀疑这就是问题所在:
writer.Write(new String(buf));
您总是从所有buf
创建一个字符串,而不仅仅是第一个nin
字符。如果您的任何文件很短,您可能会得到“null”Unicode字符(即U+0000),在某些应用程序中,这些字符可能被视为字符串终止符
甚至不需要创建字符串-只需使用:
writer.Write(buf, 0, nin);
(顺便说一句,我还强烈建议使用使用语句,而不是手动调用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));
}
}
使用(var writer=File.CreateText(“G:/user/data/yr2009/fy09_filtered.txt”))
{
对于(int i=1;我知道您可以将文本文件与命令提示符“copy”命令一起追加,对吗?不,但我当然愿意尝试!每个文件包含大约100万行信息,我担心会丢失任何信息。这样安全吗?它从DOS时代(80年代)开始就存在了。我很确定他们解决了大部分主要故障。它没有像我预期的那样附加到fy09_filtered1.txt中。我做了前4个测试:COPY G:/user/data/yr2009/fy09_filtered1.txt+fy09_filtered2.txt+fy09_filtered3.txt+fy09_filtered4.txt您知道可以在命令提示符“COPY”下附加文本文件命令,对吗?不,但我当然愿意尝试!每个文件包含大约100万行信息,我担心会丢失任何信息。这样安全吗?它从DOS时代(80年代)开始就存在了。我很确定他们已经解决了大部分主要故障。它没有像我预期的那样附加到fy09_filtered1.txt中。我做了前4个测试:COPY G:/user/data/yr2009/fy09_filtered1.txt+fy09_filtered2.txt+fy09_filtered3.txt+fy09_filtered4.txt