Подтвердить что ты не робот

Как удалить строку из текстового файла на С#?

У меня проблема: как удалить строку из текстового файла на С#?

4b9b3361

Ответ 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], "");

Готово!