2016-11-01 5 views
1

Я пытаюсь выяснить, как удалить определенную строку из большого текстового документа с 500 000 строк. Найдите строку по контенту, но в то же время получите текущее значение индекса строки в текстовом документе, которое не должно быть нарушено, чтобы удалить следующую или предыдущую строку найденной строки, другими словами, найти ближайший по индексу, чтобы удалить как для большого документа , Потому что любой метод, который я пытался использовать с помощью File.WriteAllLines, зависает с такими размерами. Я активно запрашиваю этот файл и, похоже, должен найти другой способ. Например содержимое файла:Как найти и удалить определенную строку со следующими или предыдущими строками в большом текстовом документе

1. line 1 
2. line 2 
3. line 3 
4. line 4 
5. line 5 

и линии, чтобы найти и удалить это:

string input = "line 3" 

, чтобы получить этот результат с удалением найденного индекса строки и следующего индекса строки + 1 следующей строки, если найдено индекс строки нечетное:

line 1 
line 2 
line 5 

и в то же время быть в состоянии удалить найденный индекс строки и индекс - 1 предыдущей строке, если он найден индекс строки даже номер для поиска строки:

string input = "line 4" 

и результат должен быть:

line 1 
line 2 
line 5 

И знать, если линия не существует в текстовом документе.

Запись в один и тот же файл.

+0

Я не могу получить, когда нужно удалить _index и index + 1_, когда нужно удалить _index и index - 1_? А также какова ваша продукция? Сохранить в двух разных файлах? – Prisoner

+0

@Alex Здравствуйте, я хочу удалить - 1, если индекс текущей строки является четным числом и + 1, если нечетный, и вывести, записать в то же самое не два файла. –

+0

Можете ли вы [изменить] свой вопрос и указать правильный пример? Поскольку индекс _line 3_ является нечетным и дает другой пример для четного номера строки. – Prisoner

ответ

1

Если вы хотите обрабатывать очень большой файл, то вы должны использовать FileStream, чтобы избежать нагрузки все содержимое в память.

Для удовлетворения вашего последнего требования вы можете читать строки два на два. Это на самом деле делает ваш код более простым.

var inputFileName = @"D:\test-input.txt"; 
var outputFileName = Path.GetTempFileName(); 

var search = "line 4"; 

using (var strInp = File.Open(inputFileName, FileMode.Open)) 
using (var strOtp = File.Open(outputFileName, FileMode.Create)) 
using (var reader = new StreamReader(strInp)) 
using (var writer = new StreamWriter(strOtp)) 
{ 
    while (reader.Peek() >= 0) 
    { 
     var lineOdd = reader.ReadLine(); 
     var lineEven = (string)null; 
     if (reader.Peek() >= 0) 
      lineEven = reader.ReadLine(); 

     if(lineOdd != search && lineEven != search) 
     { 
      writer.WriteLine(lineOdd); 

      if(lineEven != null) 
       writer.WriteLine(lineEven); 
     } 
    }  
} 

// at this point, operation is sucessfull 
// rename temp file with original one 
File.Delete(inputFileName); 
File.Move(outputFileName, inputFileName); 
+0

Здравствуйте, кажется, что это полезно, но не уверен, как писать в тот же файл? Мне не нужен новый файл для вывода –

+0

@TimR Вы можете просто записать во временный файл, и если операция выполнена успешно, удалите исходный файл, а затем переименуйте временный файл с оригинальным. Этот подход более безопасен, потому что если что-то не так в середине обработки, исходный файл еще не изменен. –

+0

@TimR См. Мое редактирование, чтобы сделать это. –

0

Пусть входной файл inputFile.txt, тогда вы можете использовать метод File.ReadAllLines(), чтобы получить все строки в этом конкретном файле. Затем используйте метод IndexOf(), чтобы найти индекс конкретной строки в этом списке, если он не найден, значит он вернет -1, затем используйте RemoveAt(), чтобы удалить строку по этому конкретному индексу. Рассмотрим код:

List<string> linesInFile = File.ReadAllLines(filePath).ToList(); // gives you list of lines 
string input = "line 3"; 
int lineIndex = linesInFile.IndexOf(input); 
if (lineIndex != -1) 
{ 
    linesInFile.RemoveAt(lineIndex); 
} 

// If you may have more number of match for particular line means you can try this as well : 

linesInFile.RemoveAll(x=> x== input); 

Если вы хотите записать его обратно в файл означает использовать эту строку:

File.WriteAllLines(filePath,linesInFile); 
+0

Здравствуйте, как я понял, здесь мне нужно указать путь к файлу.Поэтому я не уверен, что я делаю неправильно, но он не удаляет ни одной строки. –

+0

Мы не записываем его обратно в файл, используйте 'File.WriteAllLines (filePath, linesInFile);' напишите его в файл, см. обновления –

+0

хорошо я пробовал и кажется, что он должен работать, но не может понять, что не так, он по-прежнему не удаляет –

0

Использовать System.IO.StreamReader.

private static void RemoveLines(string lineToRemove, bool skipPrevious, bool skipNext) 
{ 
      string previousLine = string.Empty; 
      string currentLine; 
      bool isNext = false; 
      using (StreamWriter sw = File.CreateText(@"output.txt")) 
      { 
       using (StreamReader sr = File.OpenText(@"input.txt")) 
       { 

        while ((currentLine = sr.ReadLine()) != null) 
        { 
         if (isNext) 
         { 
          currentLine = string.Empty; 
          isNext = false; 
         } 

         if (currentLine == lineToRemove) 
         { 
          if (skipPrevious) 
          { 
           previousLine = string.Empty; 
          } 

          if (skipNext) 
          { 
           currentLine = string.Empty; 
           isNext = true; 
          } 
         } 

         if (previousLine != string.Empty && previousLine != lineToRemove) 
         { 
          sw.WriteLine(previousLine); 
         } 
         previousLine = currentLine; 
        } 
       } 
       if (previousLine != string.Empty && previousLine != lineToRemove) 
       { 
        sw.WriteLine(previousLine); 
       } 
      } 
} 

Не проверял его, но это дало бы необходимые указания.

+0

Здравствуйте, похоже, что он должен работать. но ответ выше, полностью отвечает на мой вопрос, а также было предложено изменить для полного объяснения, поэтому контекст был изменен –

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

  • Нет связанных вопросов^_^