【问题标题】:Read source file from and XML file从 XML 文件中读取源文件
【发布时间】:2017-12-08 15:24:27
【问题描述】:

我有一个进程正在接收成对出现的文件。一个是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 不会改变。

提前致谢

【问题讨论】:

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


    【解决方案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();
            }
        }
    
    }
    

    【讨论】:

      【解决方案2】:

      到目前为止,这两种解决方案都可以帮助您识别 LocalID。太好了。

      但我认为您要求的是更大的图景。你的包裹看起来怎么样。

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-09
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2023-03-24
          • 2016-05-19
          相关资源
          最近更新 更多