首先,我想提一下,我几天前才开始学习C#,所以我对它的了解有限。
我正在尝试创建一个程序来解析用户输入的某些短语的文本文件,然后将它们输出到新的文本文档中。
目前,我有程序搜索原始输入文件并收集用户输入的选定文本,将这些行输出,创建新文本文件然后将它们合并在一起,然后删除它们。
我猜这不是最有效的创造方法,但我只是创造了它并让它以合乎逻辑的方式工作,让我理解为新手。
代码如下;
private void TextInput1()
{
using (StreamReader fileOpen = new StreamReader(txtInput.Text))
{
using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\FIRSTFILE.txt"))
{
string file;
while ((file = fileOpen.ReadLine()) != null)
{
if (file.Contains(txtFind.Text))
{
fileWrite.Write(file + "\r\n");
}
}
}
}
}
private void TextInput2()
{
using (StreamReader fileOpen = new StreamReader(txtInput.Text))
{
using (StreamWriter fileWrite = new StreamWriter(@"*DIRECTORY*\SECONDFILE.txt"))
{
string file;
while ((file = fileOpen.ReadLine()) != null)
{
if (file.Contains(txtFind2.Text))
{
fileWrite.Write("\r\n" + file);
}
}
}
}
}
private static void Combination()
{
ArrayList fileArray = new ArrayList();
using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
{
using (StreamReader reader = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
{
writer.Write(reader.ReadToEnd());
}
using (StreamReader reader = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
{
writer.Write(reader.ReadToEnd());
}
}
}
private static void Delete()
{
if (File.Exists(@"*DIRECTORY*\FIRSTFILE.txt"))
{
File.Delete(@"*DIRECTORY*\FIRSTFILE.txt");
}
if (File.Exists(@"*DIRECTORY*\SECONDFILE.txt"))
{
File.Delete(@"*DIRECTORY*\SECONDFILE.txt");
}
}
正在创建的输出文件只是输出第一个文本输入,然后是第二个。我想知道是否有可能将它们合并为1个文件,一次1行,因为它是一个连续的文件,意味着需要输入1的信息跟随2,而不是全部1,然后全部2。 / p>
谢谢,尼尔。
答案 0 :(得分:5)
要将两个文件内容逐行合并到一个合并文件中,您可以用您的Combination()代码替换
string[] file1 = File.ReadAllLines("*DIRECTORY*\FIRSTFILE.txt");
string[] file2 = File.ReadAllLines("*DIRECTORY*\SECONDFILE.txt");
using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
{
int lineNum = 0;
while(lineNum < file1.Length || lineNum < file2.Length)
{
if(lineNum < file1.Length)
writer.WriteLine(file1[lineNum]);
if(lineNum < file2.Length)
writer.WriteLine(file2[lineNum]);
lineNum++;
}
}
这假定这两个文件不包含相同数量的行。
答案 1 :(得分:3)
尝试这种方法。您可以收到三条路径。文件1,文件2和文件输出。
public void MergeFiles(string pathFile1, string pathFile2, string pathResult)
{
File.WriteAllText(pathResult, File.ReadAllText(pathFile1) + File.ReadAllText(pathFile2));
}
如果pathResult
文件存在,WriteAllText
方法将覆盖它。请记住包含System.IO
命名空间。
答案 2 :(得分:2)
如果您的输入文件很大并且内存不足,您也可以尝试将这两个读取器包装起来:
using (StreamWriter writer = File.CreateText(@"*DIRECTORY*\FINALOUTPUT.txt"))
{
using (StreamReader reader1 = File.OpenText(@"*DIRECTORY*\FIRSTFILE.txt"))
{
using (StreamReader reader2 = File.OpenText(@"*DIRECTORY*\SECONDFILE.txt"))
{
string line1 = null;
string line2 = null;
while ((line1 = reader1.ReadLine()) != null)
{
writer.WriteLine(line1);
line2 = reader2.ReadLine();
if(line2 != null)
{
writer.WriteLine(line2);
}
}
}
}
}
但是,您必须知道输入文件中有多少行,但我认为它为您提供了继续操作的一般想法。
答案 3 :(得分:1)
使用FileInfo
扩展程序,您可以通过执行以下操作合并一个或多个文件:
public static class FileInfoExtensions
{
public static void MergeFiles(this FileInfo fi, string strOutputPath , params string[] filesToMerge)
{
var fiLines = File.ReadAllLines(fi.FullName).ToList();
fiLines.AddRange(filesToMerge.SelectMany(file => File.ReadAllLines(file)));
File.WriteAllLines(strOutputPath, fiLines.ToArray());
}
}
<强>用法强>
FileInfo fi = new FileInfo("input");
fi.MergeFiles("output", "File2", "File3");
答案 4 :(得分:0)
我很欣赏这个问题几乎可以(向上)投票(本身),但是对于可扩展的方法:
const string FileMergeDivider = "\n\n";
public void MergeFiles(string outputPath, params string[] inputPaths)
{
if (!inputPaths.Any())
throw new ArgumentException(nameof(inputPaths) + " required");
if (inputPaths.Any(string.IsNullOrWhiteSpace) || !inputPaths.All(File.Exists))
throw new ArgumentNullException(nameof(inputPaths), "contains invalid path(s)");
File.WriteAllText(outputPath, string.Join(FileMergeDivider, inputPaths.Select(File.ReadAllText)));
}