2009-08-07 2 views
23

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

Любые предложения или примеры были бы высоко оценены?

Вопросы, относящиеся

Efficient way to delete a line from a text file (C#)

+0

Как определить эту линию? По своей позиции? По его точному тексту? Одним словом, он содержит? – Noldorin

ответ

39

Если линия вы хотите удалить, на основе содержимого строки:

string line = null; 
string line_to_delete = "the line i want to delete"; 

using (StreamReader reader = new StreamReader("C:\\input")) { 
    using (StreamWriter writer = new StreamWriter("C:\\output")) { 
     while ((line = reader.ReadLine()) != null) { 
      if (String.Compare(line, line_to_delete) == 0) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 

Или, если она основана на номер строки:

string line = null; 
int line_number = 0; 
int line_to_delete = 12; 

using (StreamReader reader = new StreamReader("C:\\input")) { 
    using (StreamWriter writer = new StreamWriter("C:\\output")) { 
     while ((line = reader.ReadLine()) != null) { 
      line_number++; 

      if (line_number == line_to_delete) 
       continue; 

      writer.WriteLine(line); 
     } 
    } 
} 
13

Лучший способ сделать это, чтобы открыть файл в текстовом режиме, прочитайте каждую строку с ReadLine(), а затем записать его в новый файл с WriteLine(), пропуская одну строку, которую вы хотите удалить.

Как я знаю, не существует общей функции удаления строки из файла.

+1

+1 для того, чтобы лучше кэшировать все строки, а затем писать обратно без удаления. –

1
  1. Читайте и помните каждую строку

  2. Идентифицировать тот, который вы хотите, чтобы избавиться от

  3. Забудьте, что один

  4. Написать остальное обратно поверх в файл

+0

Забудьте об этом? Как вы можете это сделать? –

7

Один из способов сделать это, если файл не очень велик, чтобы загрузить все строки в массив:

string[] lines = File.ReadAllLines("filename.txt"); 
string[] newLines = RemoveUnnecessaryLine(lines); 
File.WriteAllLines("filename.txt", newLines); 
+0

Да, это приятный простой способ, если файл можно полностью хранить в памяти с легкостью. – Noldorin

+0

Несомненно, этот метод применим только в том случае, если содержимое файла может вписываться в память, иначе метод «потоковой передачи» и временный файл должны использоваться, как было предложено Aric TenEyck. –

2

Вы можете использовать C# дженериков для этого, чтобы сделать его реальным легко:

 var file = new List<string>(System.IO.File.ReadAllLines("C:\\path")); 
     file.RemoveAt(12); 
     File.WriteAllLines("C:\\path", file.ToArray()); 
+0

Это было бы не так здорово в больших файлах, но умнее, тем меньше. – Gregory

+1

Проблема в том, что файл не может вписаться в память ... –

0

Вы работаете в операционной системе Unix?

Вы можете сделать это с помощью редактора потока sed. Прочтите страницу руководства для «sed»

0

Что? Используйте файл open, найдите позицию, затем очистите строку, используя null.

Gotch it? Простые, потоковые, без массива, которые едят память, быстро.

Эта работа на VB .. Пример поиска линия культура = идентификатор, где культура и идентификатор имя-значение имеют значение, и мы хотим изменить его культуру = еп

Fileopen(1,"text.ini") 
    dim line as string 
    dim currentpos as long 
    while true 
    line = lineinput(1) 
    dim namevalue() as string=split(line,"=") 
    if namevalue(0)="line name value that i want to edit" then 
    currentpos=seek(1) 
    fileclose() 
    dim fs as filestream("test.ini",filemode.open) 
    dim sw as streamwriter(fs) 
    fs.seek(currentpos,seekorigin.begin) 
    sw.write(null) 
    sw.write(namevalue+"="+newvalue) 
    sw.close() 
    fs.close() 
    exit while 
    end if 
    msgbox("org ternate jua bisa, no line found") 
end while 

это all..use #d

+1

Используйте 4 пробела для отступов кода :) – Gregory

2

Не требуется код ракеты-носителя. Надеюсь, этот простой и короткий код будет help.

List linesList = File.ReadAllLines("myFile.txt").ToList();    
linesList.RemoveAt(0); 
File.WriteAllLines("myFile.txt"), linesList.ToArray()); 

ИЛИ использование this

public void DeleteLinesFromFile(string strLineToDelete) 
    { 
     string strFilePath = "Provide the path of the text file"; 
     string strSearchText = strLineToDelete; 
     string strOldText; 
     string n = ""; 
     StreamReader sr = File.OpenText(strFilePath); 
     while ((strOldText = sr.ReadLine()) != null) 
     { 
      if (!strOldText.Contains(strSearchText)) 
      { 
       n += strOldText + Environment.NewLine; 
      } 
     } 
     sr.Close(); 
     File.WriteAllText(strFilePath, n); 
    } 
0

Это может быть сделано в три этапа:

// 1. Read the content of the file 
string[] readText = File.ReadAllLines(path); 

// 2. Empty the file 
File.WriteAllText(path, String.Empty); 

// 3. Fill up again, but without the deleted line 
using (StreamWriter writer = new StreamWriter(path)) 
{ 
    foreach (string s in readText) 
    { 
     if (!s.Equals(lineToBeRemoved)) 
     { 
      writer.WriteLine(s); 
     } 
    } 
}