Удалите строки, содержащие строку, и измените значение оставленных строк. - PullRequest
0 голосов
/ 21 марта 2020

Мне нужна небольшая помощь по удалению некоторых строк из нескольких текстовых файлов (50.000), содержащих указанную строку, а затем для изменения значения оставшихся строк, в моем случае это может быть 0 строк или любое случайное число. Вот пример кода:

This is a test to remove lines containing a string:
//some other lines
0
0
//...

7
This line contains string "ONE"
This line contains string "2"
This line contains string "THREE", "9"
This line contains string "FOUR"
This line contains string "5"
This line contains string "SIX" , "ZERO"
This line contains string "SEVEN"
//more consecutive lines and 7 value from top, represents the number of lines that are following, until other function starts.

0
0
//...

Это функция в C#, которую я использую для удаления строк:

foreach (var f in Directory.GetFiles(@"E:/WORK/Tests", "*", SearchOption.AllDirectories).AsParallel())
{
    string[] LinesToRemove = { "ONE", "2", "THREE", "FOUR", "5", "SIX", "SEVEN" };
    var query = File.ReadAllLines(f, Encoding.Unicode).Where(line => !LinesToRemove.Any(line.Contains));
    File.WriteAllLines(f, query, Encoding.Unicode);
}

7, это количество строк. Я хочу, например, удалить все 7 строк (используя удаление строковых строк) и переместиться на 1 строку вверх и заменить эти 7 на 0. Все строки идут подряд после этого значения 7.

С уважением и оставайтесь в безопасности!

1 Ответ

1 голос
/ 21 марта 2020

Ну, это было весело.

Вот вам go.

foreach (var f in Directory.GetFiles(@"E:/WORK/Tests", "*", SearchOption.AllDirectories).AsParallel())
{
    string[] LinesToRemove = { "ONE", "2", "THREE", "FOUR", "5", "SIX", "SEVEN" };
    string[] linesInFile = File.ReadAllLines(f);
    List<string> newFileLines = new List<string>();

    for (int i = 0; i < linesInFile.Length;)
    {
        int n;
        bool isNumeric = int.TryParse(linesInFile[i], out n);
        if (isNumeric && n > 0)
        {
            List<string> tempLines = new List<string>();
            int remainingLines = 0;
            int m = i + n + 1;
            for (int y = i + 1; y < m; y++)
            {
                if(y >= linesInFile.Length)
                {
                    break; //I think this should work since i haven't checked
                    // Or something like i++; break;

                }

                if (!LinesToRemove.Any(s => linesInFile[y].Contains(s)))
                {
                    tempLines.Add(linesInFile[y]);
                    remainingLines++;
                }
                i++;
            }
            i++;
            newFileLines.Add(remainingLines.ToString());
            newFileLines.AddRange(tempLines);
        }
        else
        {
            newFileLines.Add(linesInFile[i]);
            i++;
        }
    }
    File.WriteAllLines(f, newFileLines);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...