我正在尝试编写一个快速且脏的控制台应用程序实用程序来查找文件中的ObjectName,然后将所有出现的Application Name设置为ObjectName。 (这些是SSIS包(xml))
对象名称是一个简单的字符串[DTS:ObjectName =" ETL Hbhc Receptive Communication" ]但Application Name嵌入在连接字符串中。 (如下图所示)
我没有从Replace语句获得所需的结果,并且文件末尾出现了一些显示在文件比较中的内容。当我尝试在SQL Server中运行SSIS包时,我得到一个无效的xml格式错误。我能看到的唯一可见的是替换文本周围的引号。我认为这是问题所以如何在没有引号的情况下替换文本?
差异检查器还标记文件的最后一行是不同的但我没有看到任何明显的东西。两者都有文字。
的差异: 在编辑之前:
DTS:ConnectionString="Data Source=r04phidwh62;Initial Catalog=v5dwst;Provider=SQLNCLI11;Integrated Security=SSPI;Auto Translate=False;Application Name=SSIS-Laboratory Fact Daily-{3CFA3DD8-2A24-40EB-8303-F3BC71507735}V5DWST;" />
编辑后:
DTS:ConnectionString="Data Source=r04phidwh62;Initial Catalog=v5dwst;Provider=SQLNCLI11;Integrated Security=SSPI;Auto Translate=False;Application Name="ETL Hbhc Receptive Communication"-{3CFA3DD8-2A24-40EB-8303-F3BC71507735}V5DWST;" />
申请代码:
static void Main(string[] args)
{
string[] files = Directory.GetFiles(@"d:\Transforms\", "*.dtsx")
.Select(path => Path.GetFileName(path))
.ToArray();
int counter = 0;
string line;
for (int i = 0; i < files.Length; i++)
{
using (var outputfile = new StreamWriter(@"D:\Transforms\output.txt"))
{
// Read the file and display it line by line.
System.IO.StreamReader file =
new System.IO.StreamReader(@"D:\Transforms\" + files[i]);
string test = "";
while ((line = file.ReadLine()) != null)
{
if (line.Contains("DTS:ObjectName"))
{
if (test.Length == 0)
{
test = line.Substring(line.IndexOf("=") + 1);
System.Console.WriteLine(test);
}
}
if (line.Contains("Application Name"))
{
string output = line.Substring(line.IndexOf("Application Name=") + 17);
if (output.Contains("-{"))
{
output = output.Substring(0, output.IndexOf("-{"));
}
else
{
output = output.Substring(0, output.IndexOf(";"));
}
System.Console.WriteLine(output);
line = Regex.Replace(line, output , test);
}
outputfile.WriteLine(line);
counter++;
}
file.Close();
outputfile.Close();
// Suspend the screen.
System.Console.ReadLine();
File.Delete(@"D:\Transforms\" + files[i]);
File.Move(@"D:\Transforms\output.txt", @"D:\Transforms\" + files[i]);
}
}
}
答案 0 :(得分:1)
好的,我想我看到了问题。
当您在文件中遇到此字符串时:
DTS:ObjectName="ETL Hbhc Receptive Communication"
...您正在使用子字符串来获取=
符号后的所有内容。
“Everything”包含原始文本中的引号。所以不是这样:
ETL Hbhc Receptive Communication
...如果它是C#文字,它看起来像"ETL Hbhc Receptive Communication"
,你有这个:
"ETL Hbhc Receptive Communication"
...看起来像"\"ETL Hbhc Receptive Communication\""
作为C#文字。
如果从提取的字符串中删除第一个和最后一个字符,或者如果修改子字符串代码以允许第一个和最后一个字符,则应该没问题。