1

我有一个文本文件 1,我希望在新文件 3 中提取行(文件 2 中不存在)

例子 :

文件1:

/**
* Gets the total volume.
*
* @return the total volume
*/
public int getTotalVolume() {return totalVolume;}

文件2:

* Gets the total volume.
*
* @return the total volume

文件3:

/**
 */
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 并出现错误:错误 Object reference not set to an instance of an object

4

5 回答 5

3

使用 Linq 的简单解决方案:

var file1 = File.ReadAllLines("file1name");
var file2 = File.ReadAllLines("file2name");
var file3 = file1.Except(file2);
File.WriteAllLines("fileName3", file3);
于 2013-07-31T10:45:17.163 回答
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);
}
于 2013-07-31T10:53:52.013 回答
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);
                        }
                    }
                }
            }
        }
    }
于 2013-07-31T10:56:04.127 回答
0

这个解决方案最有可能让你得到你抱怨的错误,因为
1.first 你在 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
            }
于 2013-07-31T10:52:18.680 回答
0

您应该在到达函数时检查 nullstrings并且更无能为力地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();
}
于 2013-07-31T10:44:18.697 回答