Powershell:将2个文件基于2列进行比较

时间:2013-02-28 08:41:20

标签: regex powershell

德国的早安,抱歉我的英语不好。

我希望有人可以帮助我。

我们必须将2 .xls或.csv文档与超过4000行进行比较。 两个文档都有一个E列,具有相同的交货单编号。 此交货单编号不是唯一的,该编号可以在E列中使用多次。 每个交货单编号在D列中也有许多件。

如果两个文件中的交货单编号和数量匹配,我们可以忽略并删除该行。 将两个文件与超过4000行进行比较是非常昂贵的,所以我希望可以与Powershell进行正则表达式的比较。

我的想法: 将xls转换为csv并执行以下操作: 读取行并使用E列和D列的条目。列E的Foreach Entry,检查第二个文件中是否存在此条目。如果条目存在,请检查列D是否与file1中的相同。 如果两个Entrys匹配,则删除或复制两个文件中的两行。

至少我们有两个Entrys没有作业的文件。

这可能吗?

使用PowerShell我可以很好地处理,但使用正则表达式... :/

提前致谢 丹尼尔

2 个答案:

答案 0 :(得分:0)

如果您将两个值视为复合主键,则似乎可以解决问题。你说E列中的第一个值不一定是唯一的。你能告诉我它与数量结合时是否总是独一无二的?

无论如何,我建议,为了处理这个,只是为了获得(Col E,col D)组合的唯一列表,你甚至可以只采用“E,D”格式的字符串,只要col E和col D不包含逗号。获取此唯一值后,将其放在哈希表中,格式化值作为键,并将该键的文件数组作为值。

现在,您可以有效地查找存在Col E,Col D组合的文件,因此您应该能够根据需要处理特定用例。

答案 1 :(得分:0)

4000行听起来不是很多。试试这个:假设csv文件被称为“1.csv”和“2.csv”

add-content 3.csv (get-content 1.csv) 
add-content 3.csv (get-content 2.csv) 

import-csv -header A,B,C,D,E,F 3.csv  | 
    group E,D | 
    where { $_.count -eq 1 } | 
    foreach { $_.group } |
    export-csv 3.diff.csv -noTypeInformation

“3.diff.csv”将仅包含唯一记录。