我有一个文本file1,我希望在新文件3中提取行(在file2中不存在)
示例:
文件1:
/**
* Gets the total volume.
*
* @return the total volume
*/
public int getTotalVolume() {return totalVolume;}
file2的:
* Gets the total volume.
*
* @return the total volume
file3的:
/**
*/
public int getTotalVolume() {return totalVolume;}
我的职能:
public void Traitv2(string file1, string file2, string file3)
{
StreamReader monStreamReaderfile1 = new StreamReader(file1);
StreamWriter monStreamWriterfile3 = new StreamWriter(file3);
string ligne = monStreamReaderfile1.ReadLine();
while (ligne != null)
{
StreamReader monStreamReaderfile2 = new StreamReader(file2);
string ligne1 = monStreamReaderfile2.ReadLine();
while (ligne1 != null)
{
if (!ligne.Equals(ligne1))
{
Console.WriteLine(ligne);
monStreamWriterfile3.WriteLine(ligne);
}
ligne1 = monStreamReaderfile2.ReadLine();
ligne = monStreamReaderfile1.ReadLine();
}
ligne = monStreamReaderfile1.ReadLine();
monStreamReaderfile2.Close();
}
monStreamWriterfile3.Close();
monStreamReaderfile1.Close();
}
当我运行此函数时,结果为false并发生错误:error对象引用未设置为对象的实例
答案 0 :(得分:3)
使用Linq的简单解决方案:
var file1 = File.ReadAllLines("file1name");
var file2 = File.ReadAllLines("file2name");
var file3 = file1.Except(file2);
File.WriteAllLines("fileName3", file3);
答案 1 :(得分:1)
此解决方案将file2读入数组,然后根据file2是否包含该行逐行读/写。
public void Traitv2(string file1, string file2, string file3)
{
var file2Lines = File.ReadAllLines(file2);
IEnumerable<string> lines = File.ReadLines(file1)
.Where(line => !file2Lines.Contains(line));
File.WriteAllLines(file3, lines);
}
答案 2 :(得分:1)
public void Traitv2(string file1, string file2, string file3)
{
string line1;
string line2;
using (var reader1 = new StreamReader(file1))
using (var writer = new StreamWriter(file3))
{
while ((line1 = reader1.ReadLine()) != null)
{
using (var reader2 = new StreamReader(file2))
{
while ((line2 = reader2.ReadLine()) != null)
{
if (!line1.Equals(line2))
{
writer.WriteLine(line1);
}
}
}
}
}
}
答案 3 :(得分:0)
你应该在strings
找到该函数并且更加无效StreamReader
以及你读到的行
由于以下行,您将获得null:
ligne = monStreamReaderfile1.ReadLine();
在while循环中。
文件到了最后,你试着读。 在行之前检查null
if (!ligne.Equals(ligne1))
这是完整的答案代码
public void Traitv2(string file1, string file2, string file3)
{
StreamReader monStreamReaderfile1 = new StreamReader(file1);
StreamWriter monStreamWriterfile3 = new StreamWriter(file3);
string ligne = monStreamReaderfile1.ReadLine();
while (ligne != null)
{
StreamReader monStreamReaderfile2 = new StreamReader(file2);
string ligne1 = monStreamReaderfile2.ReadLine();
while (ligne1 != null)
{
if (ligne != null && !ligne.Equals(ligne1))
{
Console.WriteLine(ligne);
monStreamWriterfile3.WriteLine(ligne);
}
ligne1 = monStreamReaderfile2.ReadLine();
ligne = monStreamReaderfile1.ReadLine();
}
ligne = monStreamReaderfile1.ReadLine();
monStreamReaderfile2.Close();
}
monStreamWriterfile3.Close();
monStreamReaderfile1.Close();
}
答案 4 :(得分:0)
这个解决方案最有可能让你得到你抱怨的错误,因为
1.首先你要在while语句中检查ligne1!= null
2.然后在里面你检查ligne2的非空性并增加和使用ligne1和ligne2
while (ligne1 != null)
{
if (!ligne.Equals(ligne1))
{
Console.WriteLine(ligne);
monStreamWriterfile3.WriteLine(ligne);
}
ligne1 = monStreamReaderfile2.ReadLine();
ligne = monStreamReaderfile1.ReadLine();
//here you are incrementing ligne but not
//checking nullabllity
}