使用C#从文件中提取行

时间:2013-07-31 10:38:52

标签: c#-4.0

我有一个文本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对象引用未设置为对象的实例

5 个答案:

答案 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
            }