Удаление текста между двумя строками - PullRequest
0 голосов
/ 24 октября 2018

Я пытаюсь удалить строки, которые находятся между двумя разными линиями.В настоящее время у меня есть:

string s = "";
String path = @"C:\TextFile";
StreamWriter sw = new StreamWriter(path, true);
StreamReader sr = new StreamReader(path, true);

s = sr.ReadLine();

if (s=="#Start")
{
    while (s != "#End")
    {
        sw.WriteLine(s);
        //need something here to overwrite existing data with s not just add s
    }
}  

sr.Close();
sw.Close();  

Содержимое моего текстового файла выглядит следующим образом:

#Start
facebook.com
google.com
youtube.com
#End     

Я пытался следовать Эффективный способ удаления строки из текстового файла однако он удаляет любой файл, содержащий определенный символ, тогда как за пределами диапазона есть другие строки, содержащие .com, которые я не хочу удалять

Я хочу удалить все содержимое в промежутке между запускоми завершается, так что после запуска метода остатки текстового файла

#Start
#End

Ответы [ 3 ]

0 голосов
/ 24 октября 2018

Вы должны проверить и переписать все между #Start и #End, вместо того, чтобы файл начинался только с "#Start".

Вы можете попробовать это:

            //Read all text lines first
        string[] readText = File.ReadAllLines(path);

        //Open the text file to write
        var oStream = new FileStream(path, FileMode.Truncate, FileAccess.Write, FileShare.Read);
        StreamWriter sw = new System.IO.StreamWriter(oStream);


        bool inRewriteBlock = false;

        foreach (var s in readText)
        {
            if (s.Trim() == "#Start")
            {
                inRewriteBlock = true;
                sw.WriteLine(s);
            }
            else if (s.Trim() == "#End")
            {
                inRewriteBlock = false;
                sw.WriteLine(s);
            }
            else if (inRewriteBlock)
            {
                //REWRITE DATA HERE (IN THIS CASE IS DELETE LINE THEN DO NOTHING)
            }
            else
            {
                sw.WriteLine(s);
            }
        }

        sw.Close();
0 голосов
/ 24 октября 2018

Вы можете просто сделать это: (Предполагается, что файл может быть сохранен в памяти)

string path = @"C:\\Users\\test\\Desktop\\Test.txt";

List<string> fileData = File.ReadAllLines(path).ToList();
// File.ReadAllLines(path).ToList().Select(y => y.Trim()).ToArray().ToList(); will remove all trailing/preceding spaces in data
int startsWith = fileData.IndexOf("#Start");
int endsWith = fileData.IndexOf("#End");

if(startsWith != -1 && endsWith != -1)
  fileData.RemoveRange(startsWith+1, endsWith-1);

File.WriteAllLines("C:\\Test\\Test1.txt", fileData.ToArray());

Он не учитывает особые сценарии, такие как начальный-с-конец файла без концов.

0 голосов
/ 24 октября 2018

У вас есть две проблемы:

  1. Вы читаете только первую строку, а затем везде используете это одно значение.Ясно, что если s == "#Start", он также не может удовлетворять условию s == "#End" и т. Д.
  2. Даже если вы читали каждую строку, вы ожидаете, что после #End больше не будет данных - вы нене проходите по остальным строкам, просто перестаньте писать.Исходя из вашего вопроса, я думаю, что вы хотите написать все строки из файла и изменить только те строки, которые находятся между #Start и # End.

-

Возможно, постоянный цикл, как показано нижебыть лучше?:

string s;
bool inRewriteBlock = false;
while ((s = sr.ReadLine()) != null)
{
    if (s == "#Start")
    {
        inRewriteBlock = true;
    }
    else if (s == "#End")
    {
        inRewriteBlock = false;
    }
    else if (inRewriteBlock)
    {
        sw.WriteLine(s);
        //need something here to overwrite existing data with s not just add s
    }
    else
    {
        sw.WriteLine(s);
    }
}

По умолчанию код будет выводить каждую строку, которую он читает дословно.Однако, если он читает #Start, он войдет в специальный режим (inRewriteBlock == true), где вы можете переписать эти строки так, как вам хочется.Как только он достигнет #End, он вернется в режим по умолчанию (inRewriteBlock == false).

...