Я хочу добавить закрывающую круглую скобку к каждой строке текста, которая заканчивается на «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);
}
}
}
ну fileCont == "\n"
вряд ли правда, одна пустая строка в файле. И если это правда, то fileCont.Contains(..)
будет ложью
Честно говоря, на данный момент не совсем понятно, чего вы на самом деле пытаетесь достичь. Что бы это ни было, я ожидаю, что вам, вероятно, будет лучше с StreamWriter
, поскольку вы, очевидно, хотите записать в файл несколько вещей. Для вашей заявленной цели (любая строка, начинающаяся с CSQL..., добавьте )
в конец), я ожидаю, что ваш текущий подход в любом случае будет немного базовым. Вероятно, вы захотите прочитать файл построчно и принять разумное решение на основе прочитанного. Вы можете использовать StreamReader
для этого.
Вы должны использовать Regex. что, если create view
на самом деле create view
или create\r\n view
?
это никогда не может быть правдой
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))
Используйте страницу, подобную этой, чтобы проверить регулярное выражение на соответствие содержимому файла.
1. Не отмечайте
[visual-studio]
, если ваш вопрос не касается использования приложения Visual Studio. Этот вопрос не об этом. 2. Как вообщеfileCont
может когда-либо точно равняться"\r"
(одному символу), а также содержать последовательность символов ("CSQL_CREATE_VIEW ("
)? Я думаю, вам нужно еще немного подумать над своим вопросом и написать код, прежде чем публиковать его.