Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/xml/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 基于XML文件中声明的规则,基于同一词典中的部分键匹配词典中的字符串值_C#_Xml_Dictionary_Matching_String Matching - Fatal编程技术网

C# 基于XML文件中声明的规则,基于同一词典中的部分键匹配词典中的字符串值

C# 基于XML文件中声明的规则,基于同一词典中的部分键匹配词典中的字符串值,c#,xml,dictionary,matching,string-matching,C#,Xml,Dictionary,Matching,String Matching,我正试图找到一种有效的方法,根据XML文件中规定的规则匹配此词典中的字符串 我将尝试从一开始就解释代码。有两个csv文件 File1.csv File2.csv XML: <?xml version="1.0" encoding="utf-8" ?> <FeedInfo> <Rule> <RuleInfo> <RuleName>Rule 1</RuleName> </RuleInfo> <Rule

我正试图找到一种有效的方法,根据XML文件中规定的规则匹配此词典中的字符串

我将尝试从一开始就解释代码。有两个csv文件

File1.csv

File2.csv

XML:

<?xml version="1.0" encoding="utf-8" ?>
<FeedInfo>

<Rule>

<RuleInfo>
  <RuleName>Rule 1</RuleName>
</RuleInfo>

<Rules>
  <item name ="FirstName" NoOfChars ="ALL" number ="0"/>
  <item name ="LastName" NoOfChars ="ALL" number ="1"/>
  <item name ="ID" NoOfChars ="ALL" number ="2" />

</Rules>

</Rule>


</FeedInfo>
还有这样的字典XML字典

 TRAROB,Ref_1==KEN|CARPENTER|67814|1122 
 TRAROB,Ref_2==TRAN|ROBINSON|67814|1122
 TRAROB,Ref_3==TRAN|ROBINSON|67871|1122
 TRAROB,Ref_4==TRAN|ROBINSON|67871|1122
 MCKBAR,Ref_5==LAWSN|PERDUE|6761|2009
 MCKBAR,Ref_6==MCKEN|BARNUM|6761|2009
 MCKBAR,Ref_7==MCKEN|BARNUM|6768|2009
 MCKBAR,Ref_8==MCKEN|BARNUM|6768|2009
 TRAROB,Ref_9==TRAN|ROBINSON|67871|1122
[Rule1|0]
[Rule1|1]
[Rule1|2]
现在,在这一切之后,我被困在这里:我需要用相同的部分键匹配所有值,即SID或KEY.split(,)[0]。在最后一个字典中,基于XML中提到的数字。拆分值后数组的第0、第1和第2个位置应连接起来

我已经创建了字符串列表(int)格式的XML字典。因此,Ref_1应基于(0,1,2)与Ref_2、Ref 3、Ref_4匹配,即firstName、LastName、ID的串联。例如:

参考文献1、参考文献2、参考文献3、参考文献4都具有相同的SID(SidRefId字典) 所以我需要匹配

KENCARPENTER67814和TRAYROBINSON67814、TRAYROBINSON67871、TRAYROBINSON67871和TRAYROBINSON67871,这将为KENCARPENTER67814返回FALSE,因为所有字符串都不匹配,类似地,所需输出为:

 RULE1,TRAROB,Ref_1==KEN|CARPENTER|67814|1122|FALSE
 RULE1,TRAROB,Ref_2==TRAN|ROBINSON|67814|1122|FALSE
 RULE1,TRAROB,Ref_3==TRAN|ROBINSON|67871|1122|TRUE 
 RULE1,TRAROB,Ref_4==TRAN|ROBINSON|67871|1122|TRUE
 RULE1,MCKBAR,Ref_5==LAWSN|PERDUE|6761|2009|FALSE
 RULE1,MCKBAR,Ref_6==MCKEN|BARNUM|6761|2009|FALSE
 RULE1,MCKBAR,Ref_7==MCKEN|BARNUM|6768|2009|TRUE
 RULE1,MCKBAR,Ref_8==MCKEN|BARNUM|6768|2009|TRUE
 RULE1,TRAROB,Ref_9==TRAN|ROBINSON|67871|1122|TRUE
我曾想复制一份SidRefId
字典,并将其相互匹配,但对于大型文件和XML文件中的多个规则,这将花费大量时间,我将要处理这些问题


有人能告诉我一个有效的方法吗?谢谢

在我看来,您似乎正在尝试开发自己的引擎以实现记录链接。也就是说,用于查找不完全重复的重复记录。如果我是你的话,我不会尝试制造自己的引擎,而是使用现有的引擎

Wikipedia曾经有一个这样的引擎列表,但是它被删除了,我不知道还有其他的列表,所以我只链接到我制作的一个。还有其他引擎

如果您坚持自己做这件事,一种方法就是您在这里所做的:为每个记录构建一个键,然后按键分组。不过,这是相当原始的,所以您应该在按键进行匹配之后进行更详细的匹配。仅按键匹配将导致许多误报

一个更复杂的方法是像我所做的那样:用Lucene这样的搜索引擎为数据编制索引,然后搜索类似的记录,并对候选人进行详细的比较。或者可以使用位置敏感哈希。或度量空间。或基于q-gram的索引

 TRAROB,Ref_1==KEN|CARPENTER|67814|1122 
 TRAROB,Ref_2==TRAN|ROBINSON|67814|1122
 TRAROB,Ref_3==TRAN|ROBINSON|67871|1122
 TRAROB,Ref_4==TRAN|ROBINSON|67871|1122
 MCKBAR,Ref_5==LAWSN|PERDUE|6761|2009
 MCKBAR,Ref_6==MCKEN|BARNUM|6761|2009
 MCKBAR,Ref_7==MCKEN|BARNUM|6768|2009
 MCKBAR,Ref_8==MCKEN|BARNUM|6768|2009
 TRAROB,Ref_9==TRAN|ROBINSON|67871|1122
[Rule1|0]
[Rule1|1]
[Rule1|2]
 RULE1,TRAROB,Ref_1==KEN|CARPENTER|67814|1122|FALSE
 RULE1,TRAROB,Ref_2==TRAN|ROBINSON|67814|1122|FALSE
 RULE1,TRAROB,Ref_3==TRAN|ROBINSON|67871|1122|TRUE 
 RULE1,TRAROB,Ref_4==TRAN|ROBINSON|67871|1122|TRUE
 RULE1,MCKBAR,Ref_5==LAWSN|PERDUE|6761|2009|FALSE
 RULE1,MCKBAR,Ref_6==MCKEN|BARNUM|6761|2009|FALSE
 RULE1,MCKBAR,Ref_7==MCKEN|BARNUM|6768|2009|TRUE
 RULE1,MCKBAR,Ref_8==MCKEN|BARNUM|6768|2009|TRUE
 RULE1,TRAROB,Ref_9==TRAN|ROBINSON|67871|1122|TRUE