我有一个接收成对文件的进程。一个是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,它不会发生变化。
提前致谢
答案 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。大。
但我认为你要求更大的图景。你的包装看起来如何。
答案 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);
}