У меня проблема: как удалить строку из текстового файла на С#?
Как удалить строку из текстового файла на С#?
Ответ 1
Прочитайте файл, удалите строку в памяти и верните содержимое в файл (перезапись). Если файл большой, вы можете прочитать его строку для строки и создать временный файл, позже заменив исходный файл.
Ответ 2
Для очень больших файлов я бы сделал что-то вроде этого
string tempFile = Path.GetTempFileName();
using(var sr = new StreamReader("file.txt"))
using(var sw = new StreamWriter(tempFile))
{
string line;
while((line = sr.ReadLine()) != null)
{
if(line != "removeme")
sw.WriteLine(line);
}
}
File.Delete("file.txt");
File.Move(tempFile, "file.txt");
Обновление Я изначально написал это еще в 2009 году, и я подумал, что это может быть интересно с обновлением. Сегодня вы можете выполнить вышеуказанное, используя LINQ и отложенное выполнение
var tempFile = Path.GetTempFileName();
var linesToKeep = File.ReadLines(fileName).Where(l => l != "removeme");
File.WriteAllLines(tempFile, linesToKeep);
File.Delete(fileName);
File.Move(tempFile, fileName);
Приведенный выше код почти точно такой же, как в первом примере, чтение строки за строкой и сохранение минимального объема данных в памяти.
Однако отказ от ответственности может быть в порядке. Поскольку мы говорим о текстовых файлах, вам очень редко придется использовать диск в качестве промежуточного носителя. Если вы не имеете дело с очень большими файлами журналов, не должно быть проблем с чтением содержимого в памяти и не иметь необходимости иметь дело с временным файлом.
File.WriteAllLines(fileName,
File.ReadLines(fileName).Where(l => l != "removeme").ToList());
Обратите внимание, что параметр .ToList
имеет решающее значение для принудительного немедленного выполнения. Также обратите внимание, что все примеры предполагают, что текстовые файлы кодируются UTF-8.
Ответ 3
Я согласен с Джоном Сондерсом, на самом деле это не С#. Однако, чтобы ответить на ваш вопрос: вам в основном нужно переписать файл. Есть два способа сделать это.
- Прочитайте весь файл в памяти (например, с помощью
File.ReadAllLines
) - Удалите строку нарушения (в этом случае, вероятно, проще всего преобразовать массив строк в
List<string>
, а затем удалить строку) - Запишите все остальные строки назад (например, с помощью
File.WriteAllLines
) - потенциально преобразуйтеList<string>
в массив строк снова, используяToArray
Это означает, что вы должны знать, что у вас достаточно памяти. Альтернатива:
- Откройте как входной файл, так и новый выходной файл (как
TextReader
/TextWriter
, напримерFile.OpenText
иFile.CreateText
) - Прочитайте строку (
TextReader.ReadLine
) - если вы не хотите ее удалять, напишите ее в выходной файл (TextWriter.WriteLine
) - Когда вы прочтете все строки, закройте и читатель, и писатель (если вы используете инструкции
using
для обоих, это произойдет автоматически) - Если вы хотите заменить вход на выход, удалите входной файл и затем переместите выходной файл на место.
Ответ 4
Чтобы удалить элемент из текстового файла, сначала переместите весь текст в список и удалите нужный элемент. Затем напишите текст, сохраненный в списке, в текстовый файл:
List<string> quotelist=File.ReadAllLines(filename).ToList();
string firstItem= quotelist[0];
quotelist.RemoveAt(0);
File.WriteAllLines(filename, quotelist.ToArray());
return firstItem;
Ответ 5
Я продлил то, что предложил Маркус Олссон, и придумал этот класс, который добавляет несколько строк поиска и пару событий:
public static class TextLineRemover
{
public static void RemoveTextLines(IList<string> linesToRemove, string filename, string tempFilename)
{
// Initial values
int lineNumber = 0;
int linesRemoved = 0;
DateTime startTime = DateTime.Now;
// Read file
using (var sr = new StreamReader(filename))
{
// Write new file
using (var sw = new StreamWriter(tempFilename))
{
// Read lines
string line;
while ((line = sr.ReadLine()) != null)
{
lineNumber++;
// Look for text to remove
if (!ContainsString(line, linesToRemove))
{
// Keep lines that does not match
sw.WriteLine(line);
}
else
{
// Ignore lines that DO match
linesRemoved++;
InvokeOnRemovedLine(new RemovedLineArgs { RemovedLine = line, RemovedLineNumber = lineNumber});
}
}
}
}
// Delete original file
File.Delete(filename);
// ... and put the temp file in its place.
File.Move(tempFilename, filename);
// Final calculations
DateTime endTime = DateTime.Now;
InvokeOnFinished(new FinishedArgs {LinesRemoved = linesRemoved, TotalLines = lineNumber, TotalTime = endTime.Subtract(startTime)});
}
private static bool ContainsString(string line, IEnumerable<string> linesToRemove)
{
foreach (var lineToRemove in linesToRemove)
{
if(line.Contains(lineToRemove))
return true;
}
return false;
}
public static event RemovedLine OnRemovedLine;
public static event Finished OnFinished;
public static void InvokeOnFinished(FinishedArgs args)
{
Finished handler = OnFinished;
if (handler != null) handler(null, args);
}
public static void InvokeOnRemovedLine(RemovedLineArgs args)
{
RemovedLine handler = OnRemovedLine;
if (handler != null) handler(null, args);
}
}
public delegate void Finished(object sender, FinishedArgs args);
public class FinishedArgs
{
public int TotalLines { get; set; }
public int LinesRemoved { get; set; }
public TimeSpan TotalTime { get; set; }
}
public delegate void RemovedLine(object sender, RemovedLineArgs args);
public class RemovedLineArgs
{
public string RemovedLine { get; set; }
public int RemovedLineNumber { get; set; }
}
Использование:
TextLineRemover.OnRemovedLine += (o, removedLineArgs) => Console.WriteLine(string.Format("Removed \"{0}\" at line {1}", removedLineArgs.RemovedLine, removedLineArgs.RemovedLineNumber));
TextLineRemover.OnFinished += (o, finishedArgs) => Console.WriteLine(string.Format("{0} of {1} lines removed. Time used: {2}", finishedArgs.LinesRemoved, finishedArgs.TotalLines, finishedArgs.TotalTime.ToString()));
TextLineRemover.RemoveTextLines(new List<string> { "aaa", "bbb" }, fileName, fileName + ".tmp");
Ответ 6
Я бы очень просто:
- Откройте файл для чтения/записи
- Прочитайте/просмотрите его до начала строки, которую вы хотите удалить.
- Установите указатель записи на текущий указатель чтения
- Прочитайте до конца строки, которую мы удаляем и пропускаем разделители новой строки (считая количество символов, когда мы идем, назовем его nline)
- Прочитать байты и записать каждый байт в файл
- Закончив обрезать файл до (orig_length - nline).
Ответ 7
Я написал метод для удаления строк из файлов.
Эта программа использует using System.IO
.
Смотрите мой код:
void File_DeleteLine(int Line, string Path)
{
StringBuilder sb = new StringBuilder();
using (StreamReader sr = new StreamReader(Path))
{
int Countup = 0;
while (!sr.EndOfStream)
{
Countup++;
if (Countup != Line)
{
using (StringWriter sw = new StringWriter(sb))
{
sw.WriteLine(sr.ReadLine());
}
}
else
{
sr.ReadLine();
}
}
}
using (StreamWriter sw = new StreamWriter(Path))
{
sw.Write(sb.ToString());
}
}
Ответ 8
Почему это невозможно? Сначала создайте массив:
string[] lines = File.ReadAllLines(openFileDialog1.FileName);
Затем найдите строку, которую нужно удалить, и замените ее на "":
lines[x].Replace(lines[x], "");
Готово!