Удалить указанную c строку из файла в C# - PullRequest
2 голосов
/ 23 апреля 2020

Заголовок говорит сам за себя, у меня есть файл с именем test.txt со следующим содержимым:

Hello from th [BACK]e
This i [BACK]s line two.

Здесь [BACK] - это просто видимое представление возврата. Таким образом, i [BACK]s будет означать is. Поскольку после space и i.

реализовано обратное пространство, то, по сути, при нажатии кнопки я должен иметь доступ к этому файлу и удалить ВСЕ строки, содержащие слово [BACK] - 1. -1 реализовано, потому что [BACK] означает возврат на одну позицию и используется для удаления последней строки перед словом [BACK].

РЕДАКТИРОВАТЬ:

На этот раз я заменил [BACK] на [SDRWUE49CDKAS]. Просто чтобы сделать его уникальной строкой. Я также проверил на другом файле. На этот раз .html со следующим содержимым:

Alpha, Brav [SDRWUE49CDKAS]o, Charlie, Dr [SDRWUE49CDKAS][SDRWUE49CDKAS]elta, Echo.
//         ^^Implementing "backspace"    ^^Here doing it double because we made a mistake in spelling "Delta"
//These sentences should be Alpha, Bravo, Charlie, Delta, Echo

Сделал некоторые эксперименты и протестировал его с этим кодом:

        string s = File.ReadAllText(path2html);
        string line = "";
        string contents = File.ReadAllText(path2html);
        if (contents.Contains("[SDRWUE49CDKAS]"))
        {
            System.IO.StreamWriter sw = new System.IO.StreamWriter(path2html);
            s = s.Remove(s.LastIndexOf(line + "[SDRWUE49CDKAS]") - 2, 15);
            sw.WriteLine(s);
            sw.Close();
        }

Отредактированный код выше даст мне вывод на самом деле удаляя [SDRWUE49CDKAS], но не совсем так, как я хотел:

Alpha, BraS]o, Charlie, DS]elta, Echo.

Это действительно вызвало некоторую путаницу с тестированием. И также не говоря уже о том, что мне пришлось запускать этот код 3 раза, потому что у нас было 3 x [SDRWUE49CDKAS]. Так что все oop пойдет на пользу. Я проверил кучу подобных проблем в сети, но не смог найти работающую. Я пытаюсь проверить этот тоже. Но он использует StreamReader и StreamWriter одновременно. Или, может быть, я должен сделать копию оригинала и создать временный файл?

Ответы [ 2 ]

2 голосов
/ 23 апреля 2020
var s = "i [BACK]s";
s = s.Remove(s.IndexOf("[BACK]")-1, 1 + "[BACK]".Length);

результат равен "is".

Объяснение:

  • Найти начальный индекс [Back]
  • Go назад на одну позицию чтобы начать с символа до
  • Удалите оттуда этот дополнительный символ + маркерные символы

Но есть несколько проблем:

  • Это предполагает, что строка поиска находится не в начале этой строки (есть символ для удаления)
  • Плюс она удаляет только первое вхождение, поэтому вам придется повторять это, пока все не будут удалены
  • И это не обрабатывает "суррогатные пары"
0 голосов
/ 23 апреля 2020

Используйте Regex. У вас может быть несколько пробелов или нет пробелов, это в начале строки

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;


namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {
            string input = 
                "Hello from th [BACK]e\n" +
                "This i [BACK]s line two.\n";

            string pattern = @"\s*\[BACK\]";
            string output = Regex.Replace(input, pattern, "");
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...