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

Ваш код в порядке. Я выполнял их без каких-либо изменений на сервере приложений Tomcat 8. Используйте Maven для упаковки war, mvn clean package.

41
задан splattne 21 March 2009 в 17:31
поделиться

5 ответов

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

26
ответ дан Sascha 4 August 2019 в 20:29
поделиться

Для очень большие файлы я сделал бы что-то вроде этого

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.

73
ответ дан Markus Olsson 4 August 2019 в 20:29
поделиться

Я соглашаюсь с John Saunders, это не действительно конкретный C#. Однако отвечать на Ваш вопрос: в основном необходимо переписать файл. Существует два способа, которыми можно сделать это.

  • Read целый файл в память (например, с File.ReadAllLines)
  • Удаляет незаконную строку (в этом случае, является, вероятно, самым легким преобразовать массив строк в List<string>, тогда удаляют строку)
  • Запись, которую вся остальная часть строк назад (например, с File.WriteAllLines) - потенциально преобразовывает List<string> в массив строк снова с помощью ToArray

, Который означает, что необходимо знать, что у Вас есть достаточно памяти все же. Альтернатива:

  • Открытый и входной файл и новый выходной файл (как TextReader / TextWriter, например, с File.OpenText и File.CreateText)
  • Read строка (TextReader.ReadLine) - если Вы не хотите удалять его, пишут это в выходной файл (TextWriter.WriteLine)
  • при чтении всех строк закрывают и средство чтения и устройство записи (если Вы будете использовать using операторы для обоих, то это произойдет автоматически)
  • , Если Вы захотите заменить вход выводом, удалить входной файл и затем переместить выходной файл в место.
19
ответ дан Soner Gönül 4 August 2019 в 20:29
поделиться

Я был бы очень просто:

  • Открываются, файл для чтения-записи
  • Читал/искал через него до запуска строки, которую Вы хотите удалить
  • Набор указатель записи на текущий указатель чтения
  • Read до конца строки, мы удаляем и пропускаем разделители новой строки (считающий количество символов, когда мы идем, мы назовем это nline)
  • байт байтом Read, и запишите, что каждый байт в файл
  • По окончании усекает файл к (orig_length - nline).
3
ответ дан Adam Hawes 4 August 2019 в 20:29
поделиться

Удаляют блок кода из нескольких файлов

, Чтобы подробно остановиться на ответе @Markus Olsson, я должен был удалить блок кода из нескольких файлов. У меня были проблемы со шведскими символами в базовом проекте, таким образом, я должен был установить Систему. Текст. Пакет CodePagesEncodingProvider nuget и Система использования. Текст. Кодирование. GetEncoding (1252) вместо Системы. Текст. Кодирование. UTF8.

    public static void Main(string[] args)
    {
        try
        {
            var dir = @"C:\Test";
            //Get all html and htm files
            var files = DirSearch(dir);
            foreach (var file in files)
            {
                RmCode(file);
            }
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
            throw;
        }

    }

    private static void RmCode(string file)
    {
        string tempFile = Path.GetTempFileName();

        using (var sr = new StreamReader(file, Encoding.UTF8))
        using (var sw = new StreamWriter(new FileStream(tempFile, FileMode.Open, FileAccess.ReadWrite), Encoding.UTF8))
        {
            string line;

            var startOfBadCode = "<div>";
            var endOfBadCode = "</div>";
            var deleteLine = false;

            while ((line = sr.ReadLine()) != null)
            {
                if (line.Contains(startOfBadCode))
                {
                    deleteLine = true;
                }
                if (!deleteLine)
                {
                    sw.WriteLine(line);
                }

                if (line.Contains(endOfBadCode))
                {
                    deleteLine = false;
                }
            }
        }

        File.Delete(file);
        File.Move(tempFile, file);
    }

    private static List<String> DirSearch(string sDir)
    {
        List<String> files = new List<String>();
        try
        {
            foreach (string f in Directory.GetFiles(sDir))
            {
                files.Add(f);
            }
            foreach (string d in Directory.GetDirectories(sDir))
            {
                files.AddRange(DirSearch(d));
            }
        }
        catch (System.Exception excpt)
        {
            Console.WriteLine(excpt.Message);
        }

        return files.Where(s => s.EndsWith(".htm") || s.EndsWith(".html")).ToList();
    }
0
ответ дан 26 November 2019 в 21:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: