Как добавить закрывающую скобку в конец строки в С#?

Я хочу добавить закрывающую круглую скобку к каждой строке текста, которая заканчивается на «CSQL_CREATE_VIEW («+ несколько слов +»)».

Чтобы конечный результат выглядел так: CSQL_CREATE_VIEW (имя представления) /n. Я не могу получить закрывающую скобку с моим текущим кодом. Помощь!

   string[] Files = System.IO.Directory.GetFiles(@"filepath");
            string path = @"outputTextPath";


            foreach (string s in Files)
            {
            
;
                string fileCont = System.IO.File.ReadAllText(s);
                if(fileCont.Contains("create view") == true)
                {
                    File.AppendAllText(path, fileCont.Replace("create view","CSQL_CREATE_VIEW (") );
                     if (fileCont == "\r" && fileCont.Contains("CSQL_CREATE_VIEW ("))
                    {
                        File.AppendAllText(path, ")" + Environment.NewLine);
                    }
                        

                }
              

            }

1. Не отмечайте [visual-studio], если ваш вопрос не касается использования приложения Visual Studio. Этот вопрос не об этом. 2. Как вообще fileCont может когда-либо точно равняться "\r" (одному символу), а также содержать последовательность символов ("CSQL_CREATE_VIEW (")? Я думаю, вам нужно еще немного подумать над своим вопросом и написать код, прежде чем публиковать его.

ProgrammingLlama 21.11.2022 17:09

ну fileCont == "\n" вряд ли правда, одна пустая строка в файле. И если это правда, то fileCont.Contains(..) будет ложью

pm100 21.11.2022 17:10

Честно говоря, на данный момент не совсем понятно, чего вы на самом деле пытаетесь достичь. Что бы это ни было, я ожидаю, что вам, вероятно, будет лучше с StreamWriter, поскольку вы, очевидно, хотите записать в файл несколько вещей. Для вашей заявленной цели (любая строка, начинающаяся с CSQL..., добавьте ) в конец), я ожидаю, что ваш текущий подход в любом случае будет немного базовым. Вероятно, вы захотите прочитать файл построчно и принять разумное решение на основе прочитанного. Вы можете использовать StreamReader для этого.

ProgrammingLlama 21.11.2022 17:13

Вы должны использовать Regex. что, если create view на самом деле create view или create\r\n view?

T.S. 21.11.2022 17:15
Шаблоны Angular PrimeNg
Шаблоны Angular PrimeNg
Как привнести проверку типов в наши шаблоны Angular, использующие компоненты библиотеки PrimeNg, и настроить их отображение с помощью встроенной...
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Создайте ползком, похожим на звездные войны, с помощью CSS и Javascript
Если вы веб-разработчик (или хотите им стать), то вы наверняка гик и вам нравятся "Звездные войны". А как бы вы хотели, чтобы фоном для вашего...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Начала с розового дизайна
Начала с розового дизайна
Pink Design - это система дизайна Appwrite с открытым исходным кодом для создания последовательных и многократно используемых пользовательских...
Шлюз в PHP
Шлюз в PHP
API-шлюз (AG) - это сервер, который действует как единая точка входа для набора микросервисов.
14 Задание: Типы данных и структуры данных Python для DevOps
14 Задание: Типы данных и структуры данных Python для DevOps
проверить тип данных используемой переменной, мы можем просто написать: your_variable=100
0
4
69
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

это никогда не может быть правдой

if (fileCont == "\r" && fileCont.Contains("CSQL_CREATE_VIEW ("))

если fileCont == "\n", то он не может содержать "CSQL..."

может ты имеешь в виду fileCont.Endwith("\n")

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

Если я правильно понял ваше описание проблемы, вы хотите заменить текст "create view" на "CSQL_CREATE_VIEW (", а также добавить закрывающую скобку в конец этой строки.

Если это все, что нам нужно сделать, то один из способов приблизиться к этому — читать по одной строке файла за раз, а не читать весь текст сразу, и мы можем сохранить еще один список «новых» строк, которые мы будем использовать для напишите новый файл. Когда мы читаем каждую строку из входного файла, мы можем сохранить эту строку (с любыми необходимыми изменениями) в наш новый список. После того, как мы прочитали все строки, мы можем сохранить наш новый список строк в выходной файл.

Например:

public static void ReplaceCreateView(string inputFilePath, string outputFilePath)
{
    List<string> newFileLines = new List<string>();

    foreach (string line in File.ReadLines(inputFilePath))
    {
        if (line.Contains("create view"))
        {
            // Save a line where we replace 'create view' and add a closing parenthesis
            newFileLines.Add(line.Replace("create view", "CSQL_CREATE_VIEW (") + ")");
        }
        else
        {
            newFileLines.Add(line);
        }
    }

    File.WriteAllLines(outputFilePath, newFileLines);
}

Похоже, вы обновляете все файлы в определенном каталоге, поэтому один из способов сделать это — перебрать все файлы, создать новое имя файла на основе исходного имени файла и другого текста, например "_Updated", а затем передайте исходное имя файла и новое имя файла нашему методу выше в цикле:

public static void UpdateAllFiles(string directoryPath)
{
    foreach(var filePath in Directory.GetFiles(directoryPath))
    {
        // Create a new name for the file by appending '_Updated' to the orginal
        var fileName = Path.GetFileNameWithoutExtension(filePath);
        var ext = Path.GetExtension(filePath);
        var newFilePath = Path.Combine(directoryPath, $"{fileName}_Updated{ext}");

        ReplaceCreateView(filePath, newFilePath);
    }
}

Не уверен, каково было ваше намерение с выходным файлом. Вы читаете возможные несколько входных файлов и выводите только в один файл?

Во всяком случае, вот как вы могли бы изменить содержимое каждого отдельного файла, сохранив то же имя:

String[] Files = System.IO.Directory.GetFiles(@"filepath");
foreach (String s in Files)
{
    Boolean changesMade = false;
    String[] lines = System.IO.File.ReadAllLines(s);
    for(int i=0; i<lines.Length; i++)
    {
        if (lines[i].Contains("create view"))
        {
            changesMade = true;
            lines[i] = lines[i].Replace("create view", "CSQL_CREATE_VIEW (");
            if (!lines[i].EndsWith(")"))
            {
                lines[i] = lines[i] + ")";
            }
        }
    }
    if (changesMade)
    {
        System.IO.File.WriteAllLines(s, lines);
    }
}

Было бы полезно, если бы вы разместили пару примеров до и после полной рассматриваемой строки...

На мой взгляд, лучшим подходом было бы Regex. Я не совсем понимаю, как выглядит ваш текст, но этот шаблон должен работать: ((CSQL_CREATE_VIEW \()(.*)(\r|\n|\r\n))

Используйте страницу, подобную этой, чтобы проверить регулярное выражение на соответствие содержимому файла.

Другие вопросы по теме