2010-05-21 3 views
2

Я опубликовал это вчера на SO, и я получил ответ, который отлично работает, но мне нужно изменить его, и я не знаю, как это сделать.Условно убрать последнюю строку из текстового файла

Вот мой original question:


Мне нужно лишить последнюю строку из текстового файла. Я знаю, как открывать и сохранять текстовые файлы на C#, но как бы я разделил последнюю строку текстового файла?

Текстовый файл всегда будет иметь разные размеры (некоторые из них имеют 80 строк, некоторые из них - 20).

Как это сделать?


Вот код, который кто-то дал мне это сделать (который работает отлично)

//Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO 
string tempfile = @"C:\junk_temp.txt"; 

using (StreamReader reader2 = new StreamReader(newfilename)) 
{ 
    using (StreamWriter writer2 = new StreamWriter(tempfile)) 
    { 
     string line = reader2.ReadLine(); 

     while (!reader2.EndOfStream) 
     { 
      writer2.WriteLine(line); 
      line = reader2.ReadLine(); 
     } // by reading ahead, will not write last line to file 
    } 
} 

File.Delete(newfilename); 
File.Move(tempfile, newfilename); 
File.Delete(tempfile); 

Как бы я изменить это только удалить последнюю строку из текстового файла, если это строка размером 4 или 5 цифр (например, 8001 или 99999).

Если это ничего, кроме этого, например%, то я не хочу удалять последнюю строку.

Может кто-то изменить приведенный выше код, чтобы сделать это для меня?

ответ

3

Чтобы сохранить ту же логику, как у вас есть в текущем коде можно сделать следующее

 //Delete the last line from the file. This line could be 8174, 10000, or anything. This is from SO 
     string tempfile = @"C:\junk_temp.txt"; 

     using (StreamReader reader2 = new StreamReader(newfilename)) 
     { 
      using (StreamWriter writer2 = new StreamWriter(tempfile)) 
      { 
       string line = reader2.ReadLine(); 

       while (!reader2.EndOfStream) 
       { 
        writer2.WriteLine(line); 
        line = reader2.ReadLine(); 
       } // by reading ahead, will not write last line to file 

       // If the last line read does not match your condition 
       // we write it to the new file 
       if (!Regex.IsMatch(line, @"^\d{4,5}$")) 
       { 
        writer2.WriteLine(line); 
       } 
      } 
     } 

     File.Delete(newfilename); 
     File.Move(tempfile, newfilename); 
     File.Delete(tempfile); 
+0

Я думаю, вам нужно окончательное $ в вашем регулярном выражении, чтобы оно не соответствовало строке, начинающейся с 4 цифр. –

+0

@Mike Pelley, Ах спасибо! Я исправил это соответственно. –

+0

Удивительный. Спасибо. – fraXis

0

Вы должны поставить в условной проверки после

line = reader2.ReadLine(); 

к проверке EndOfStream и если это так, то ваша условная проверка на линии (либо RegEx или line.Length == 5) ,

0

Создайте RegEx, который соответствует строке 4 или 5 цифр и отфильтруйте удаление этой строки. Есть тонны хорошего сайта онлайн для практики или обучения C# RegEx.

0

Добавим, что после окончания while цикла:

if (!Regex.IsMatch(line, @"^\d{4,5}$")) 
    writer2.WriteLine(line); 
0

Изменить ваш while к:

while (!reader2.EndOfStream) 
{ 
    string line = reader2.ReadLine(); 
    if (reader2.EndOfStream && (CheckIfNeedToDeleteLine(line) == false)) 
    { 
     writer2.WriteLine(line); 
    } 
} 

Вам необходимо будет реализовать CheckIfNeedToDeleteLine(line).

bool CheckIfNeedToDeleteLine(string line) 
{ 
    int digit = 0; 
    return (((line.Length == 4) || (line.Length == 5)) && 
     (int.TryParse(line, out digit)))  
} 

Regex реализация CheckIfNeedToDeleteLine:

bool CheckIfNeedToDeleteLine(string line) 
{ 
    return Regex.IsMatch(line, @"^\d{4,5}$"); 
} 

Никакая идея, которая является более эффективным, но это не имеет никакого значения, так как это будет происходить только на последней итерации из-за порядка if заявления.

0

Я не хочу «изменять код» непосредственно для вас, но я дам вам указатель.

string line = reader2.ReadLine(); 

while (!reader2.EndOfStream) 
{ 
    writer2.WriteLine(line); 
    line = reader2.ReadLine(); 
} // by reading ahead, will not write last line to file 

Сразу после последней скобки } в этом коде, вы имеете последнюю строку файла в переменной line. В вашем текущем коде эта строка отбрасывается. Я бы посоветовал вам вставить здесь инструкцию «if», сравнив эту последнюю строку с вашими критериями. Вы можете использовать регулярное выражение для этого, что-то вроде ^[0-9]{4,5}$ должно быть подходящим.

Если критерии выполнены, просто позвоните writer2.WriteLine(line); еще раз для последней строки.

-1
 string tempfile = @"C:\junk_temp.txt"; 

     using (StreamReader reader2 = new StreamReader(newfilename)) 
     { 
      using (StreamWriter writer2 = new StreamWriter(tempfile)) 
      { 
       string line = reader2.ReadLine(); 

       while (!reader2.EndOfStream) 
       { 
        writer2.WriteLine(line); 
        line = reader2.ReadLine(); 
       } // by reading ahead, will not write last line to file 
       int result=0; 
       if (Int32.TryParse(s, out result)) 
       { 
        if (s.Length != 4 || s.Length != 5) 
         writer2.WriteLine(line); 
       } 
      } 
     } 

     File.Delete(newfilename); 
     File.Move(tempfile, newfilename); 
     File.Delete(tempfile); 
+0

Похоже, у вас есть опечатка: 'Имя 's' не существует в текущем контексте' –

+0

Также' s.Length! = 4 || s.Length! = 5' всегда будет правдой. –

Смежные вопросы