【问题标题】:Adding Case statement to REPLACE function in C#在 C# 中将 Case 语句添加到 REPLACE 函数
【发布时间】:2017-05-30 16:55:14
【问题描述】:

首先,我不是 c# 人,所以请多多包涵。 我需要在 SSIS 中的脚本任务上将出现的“D:”替换为“d$”。我确实使用替换功能来做到这一点,但问题是,这对另一行产生了意想不到的后果。

例如,脚本任务发送一封电子邮件,电子邮件的标题为 \servername\d$ \further_path。邮件正文为“UID: 1 : MESSAGE”

发送电子邮件的代码行如下:

myHtmlMessage = new MailMessage(Dts.Variables["MailFromAddress"].Value.ToString(), Dts.Variables["MailRecipients"].Value.ToString(), Dts.Variables["MailSubjectSuccess"].Value.ToString(), Dts.Variables["MailBodySuccess"].Value.ToString().Replace("D:", @"\d$   "));

我得到的当前输出是:

Server Start Time: 3/21/2017 7:25:33 AM
Server End Time: 3/21/2017 7:27:39 AM
Total Run Time: 00:02:06.9402516
Log Folder: \\ServerNamed$\Apps\SSIS\Logs\

UId$ 2 - 

预期的输出是:

Server Start Time: 3/21/2017 7:25:33 AM
Server End Time: 3/21/2017 7:27:39 AM
Total Run Time: 00:02:06.9402516
Log Folder: \\ServerNamed$\Apps\SSIS\Logs\

UID: 2 - 

查看日志文件夹行和 UID 行

当我使用替换功能时,身体线也会受到 d$ 符号的影响,这就是我想要避免的。我可以在 C# 中编写一个条件 REPLACE 函数吗,或者有没有其他方法来处理这个问题?

谢谢, 房车。

【问题讨论】:

  • 能否添加您的代码
  • 添加到问题
  • 能否请您也添加输入和输出字符串示例(预期和接收)․你的问题不完全可以理解
  • 您有示例输入体吗?我提供的示例没有处理 D: 在一个单词中(例如,正则表达式解析器无法识别“\\ServerNameD:\foo”)。
  • 从技术上讲,没有这样的输入体。所有变量值都是从包中动态收集的。但是只需要在 Log 文件夹行中将 D: 替换为 d$,而不是在整个正文中的其他位置。

标签: c# ssis script-task


【解决方案1】:

你研究过正则表达式吗?

https://msdn.microsoft.com/en-us/library/xwewhkd1(v=vs.110).aspx

这是一个如何使用它的示例...请注意,我尚未对此进行测试以确定它是否完全正常运行,但它应该可以帮助您开始走这条路:

例如

// Assign your strings into variables to make your code cleaner:
string fromAddress = Dts.Variables["MailFromAddress"].Value.ToString();
string recipients = Dts.Variables["MailRecipients"].Value.ToString();
string subject = Dts.Variables["MailSubjectSuccess"].Value.ToString();
string body = Dts.Variables["MailBodySuccess"].Value.ToString();

// Replace D: in body
string pattern = "(Log Folder.+)D:"; // Capture the D: only if it's on the Log Folder line.
string replacement = "$1\\d$   "; // What we're replacing with.
Regex rgx = new Regex(pattern);
body = rgx.Replace(body, replacement);

// Build my HTML message.
myHtmlMessage = new MailMessage(fromAddress, recipients, subject, body);

我希望这会有所帮助...

注意 - 您可以在 http://www.regular-expressions.info/ 了解更多关于正则表达式语法的信息。如果您想了解这些引擎的工作原理、它们的不同之处以及在特定上下文中查找特定表达式的最佳语法,那么值得研究一下。

【讨论】:

  • 不 - 我没有测试任何这段代码 - 它的目的是指导 OP,而不是为他做这项工作。
  • 您的代码不起作用。如果您提供示例,则添加说明如何做事,而不是给出代码说这里是例如它不工作
  • 谢谢,@S.Petrosov - 很好的建议。我已经编辑(并修复了一些代码),以便更容易理解它的上下文。
  • 让我快速尝试一下这个建议,然后回复你。
  • 这似乎没有取代日志文件夹行上的 D:。例如服务器名称是 abc123D: 应该是 abc123d$.. 但现在它仍然是 abc123D:
【解决方案2】:

这些方面的东西可能会让你到达那里:

        string x = "Server Start Time: 3/21/2017 7:25:33 AM" +
                    "Server End Time: 3 / 21 / 2017 7:27:39 AM" +
                    "Total Run Time: 00:02:06.9402516" +
                    @"Log Folder: \\ServerNameD:\Apps\SSIS\Logs\" + Environment.NewLine +

                    "UID: 2 - ";

        int lastNewlinw = x.LastIndexOf(Environment.NewLine);
        string beginning = x.Substring(0, lastNewlinw).Replace("D:", @"\d$");
        string result = string.Concat(beginning, x.Substring(lastNewlinw + 1, x.Length - beginning.Length));

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-08-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多