从XML文件中读取源文件

时间:2017-12-08 15:24:28

标签: c# sql ssis sql-server-2016 script-task

我有一个接收成对文件的进程。一个是ctr文件,另一个是数据文件。除不同的扩展名外,ctr和数据文件将始终具有相同的名称。例如。 dfghj.ctl和dfghj.dat

我遇到的问题是我同时收到了多对这些对。告诉哪个是查看ctl文件的唯一方法。这告诉我与之相关的.dat文件是report.jsonl文件还是delta.jsonl文件。

.ctl的一个例子是:

<DTSControl>
<Version>1.0</Version>
<AddressType>DTS</AddressType>
<MessageType>Data</MessageType>
<From_DTS>x26OT075</From_DTS>
<To_DTS>x26OT075</To_DTS>
<Subject>ECDS Submission</Subject>
<LocalId>TEST-delta.jsonl</LocalId>
<WorkflowId>SUS_CDS</WorkflowId>
<Encrypted>N</Encrypted>
<Compress>Y</Compress>
</DTSControl>

我需要得到的是LocalId,它告诉我.dat是什么类型的文件,因此我需要将它加载到哪个表。一旦我知道哪个文件是哪个,我就需要将关联的.dat文件名传递给变量来填充源连接。

我唯一能想到的是加载ctl文件的脚本任务,隔离LocalId,如果它像* -report.jsonl那样删除文件的最后三个字符并用dat替换ctl并传递字符串到变量但我不知道怎么去LocalId,因为我不能使用c#。

是否有人能指出如何到达那里?它可能并不总是第八行,所以我更愿意告诉它去LocalID,它不会发生变化。

提前致谢

3 个答案:

答案 0 :(得分:1)

试试xml linq:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;
using System.Xml.Linq;


namespace ConsoleApplication16
{
    class Program
    {


        static void Main(string[] args)
        {
            string xml =
               "<DTSControl>" +
                    "<Version>1.0</Version>" +
                    "<AddressType>DTS</AddressType>" +
                    "<MessageType>Data</MessageType>" +
                    "<From_DTS>x26OT075</From_DTS>" +
                    "<To_DTS>x26OT075</To_DTS>" +
                    "<Subject>ECDS Submission</Subject>" +
                    "<LocalId>TEST-delta.jsonl</LocalId>" +
                    "<WorkflowId>SUS_CDS</WorkflowId>" +
                    "<Encrypted>N</Encrypted>" +
                    "<Compress>Y</Compress>" +
               "</DTSControl>";

            XDocument doc = XDocument.Parse(xml);

            string localId = (string)doc.Descendants("LocalId").FirstOrDefault();
        }
    }

}

答案 1 :(得分:1)

到目前为止,这两个解决方案都帮助您识别LocalID。大。

但我认为你要求更大的图景。你的包装看起来如何。

  1. Foreach循环使用* .ctl
  2. 掩码的文件
  3. 将文件名存储在变量
  4. 添加脚本任务,并使用您想要的任何方法查找本地ID并存储在变量
  5. 您需要为每个可能的本地ID提供数据流。
  6. 根据本地ID
  7. 将优先约束设置为这些数据流
  8. 您的目标文件将始终基于此公式,您应该使用连接的表达式:左([步骤2的变量],len([Var from 2]) - 3)+“dat”

答案 2 :(得分:0)

这是一个使用正则表达式的解决方案:

//var input=File.ReadAllText("someFile.ctl");
var input=@"<DTSControl>
<Version>1.0</Version>
<AddressType>DTS</AddressType>
<MessageType>Data</MessageType>
<From_DTS>x26OT075</From_DTS>
<To_DTS>x26OT075</To_DTS>
<Subject>ECDS Submission</Subject>
<LocalId>TEST-delta.jsonl</LocalId>
<WorkflowId>SUS_CDS</WorkflowId>
<Encrypted>N</Encrypted>
<Compress>Y</Compress>
</DTSControl>";
Regex reg = new Regex(@".*<LocalId>(.*?)</LocalId>.*");
// Check, if it exists in the string
if(reg.IsMatch(input)){
    // Get all the Matches (here: 1)
    var mtch=reg.Matches(input);
    // collect the good stuff from the capture group
    Console.WriteLine(mtch[0].Groups[1].Value);
}