【问题标题】:How to add a closing Parenthesis to the end of a line in C#?如何在 C# 中的行尾添加右括号?
【发布时间】:2022-11-22 01:24:18
【问题描述】:

我想在以“CSQL_CREATE_VIEW (” + some words + “)”结尾的文本中的每一行中添加一个右括号

因此最终结果如下所示: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 (")?我认为您需要在发布之前多考虑一下您的问题和代码。
  • fileCont == "\n" 不太可能是真的,文件中只有一个空行。如果它是真的那么fileCont.Contains(..) 将是假的
  • 老实说,目前还不完全清楚您实际想要实现的目标。不管它是什么,我希望您使用 StreamWriter 可能会更好,因为您显然想要向文件写入多个内容。对于您既定的目标(以 CSQL 开头的任何行...,将 ) 添加到末尾),我希望您当前的方法无论如何都有些基础。您可能希望逐行阅读文件并根据阅读的内容做出明智的决定。您可以为此使用StreamReader
  • 你应该使用正则表达式。如果 create view 实际上是 create viewcreate\r\n view 怎么办?

标签: c#


【解决方案1】:

这永远不可能是真的

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

如果 fileCont == " " 那么它不能包含 "CSQL....."

也许你的意思是fileCont.Endwith(" ")

【讨论】:

    【解决方案2】:

    这种方法听起来很容易出错,因为它对文件的内容做了很多假设,但我会留给您来确定这是否真的是您想要采用的方法。

    如果我正确理解您的问题描述,您想将文本 "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);
        }
    }
    

    【讨论】:

      【解决方案3】:

      不确定您对输出文件的意图是什么。您正在读取可能的多个输入文件并且只输出到一个文件?

      无论如何,这里是您将如何更改每个单独文件的内容,同时保持相同的名称:

      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);
          }
      }
      

      如果您在有问题的完整行的示例之前和之后发布几个示例,那将很有帮助...

      【讨论】:

        【解决方案4】:

        在我看来,最好的方法是 Regex。 我不完全明白你的文字是什么样子,但这种模式应该有效: ((CSQL_CREATE_VIEW ()(.*)( | | ))

        使用this 之类的页面来针对您的文件内容测试您的正则表达式。

        【讨论】:

          猜你喜欢
          • 2021-02-26
          • 1970-01-01
          • 2020-02-24
          • 1970-01-01
          • 2013-04-27
          • 1970-01-01
          • 2017-04-10
          • 2013-05-04
          • 2021-07-27
          相关资源
          最近更新 更多