2013-07-31 4 views
1

У меня есть текст file1, и я хочу, чтобы извлечь строки (которые не существуют в file2) в новом file3извлекая строки из файла с C#

пример:

file1:

/** 
* 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(); 
    } 

Когда я запускаю эту функцию, результат является ложным и возникает ошибка: Ссылка на объект ошибка не указывает на экземпляр объекта

ответ

0

вы должны проверить на нуль в strings вы получите функции и более бессильной StreamReader и линии вы читаете

вы получаете нулевой из-за линии:

ligne = monStreamReaderfile1.ReadLine(); 

внутри цикла.

Файл дошел до конца, и вы пытаетесь его прочитать. проверка нулевой до вашей линии

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(); 
} 
+0

проблема в линии: (! Ligne.Equals (ligne1)), если и я не понимаю, почему Ligne принимает нулевое – amira

+0

@amira читать мою редактировать –

3

Простое решение с помощью Linq:

var file1 = File.ReadAllLines("file1name"); 
var file2 = File.ReadAllLines("file2name"); 
var file3 = file1.Except(file2); 
File.WriteAllLines("fileName3", file3); 
+0

это будет загружать весь файл в памяти. –

+0

Это не обязательно проблема – Raidri

+0

@ParvSharma: это правда, но хотя бы один файл должен быть загружен в память (например, файл 2), если вы не хотите читать его снова и снова для каждой строки, чтобы проверить ... – digEmAll

0

это решение, наиболее вероятно, что позволит получить ошибку вы жалуюсь, потому что
1. Сначала вы проверяете ligne1! = null в выражении while.
2.Then внутри него вы проверяете для не допустимость пустых из 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 
      } 
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); 
} 
+0

+1 Это более эффективно, поскольку оно загружает только файл 2 в память – digEmAll

+0

спасибо всем вам за ваши ответы! я думаю, что я буду использовать это решение – amira

+0

BTW, вы можете еще больше улучшить производительность, заменив первую строку: «var file2Lines = new HashSet (File.ReadLines (file2));' – digEmAll

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); 
         } 
        } 
       } 
      } 
     } 
    } 
+0

Это не работает с приведенным примером. .. – digEmAll