【问题标题】:Compare two csv files and deduct matches from original比较两个 csv 文件并从原始文件中扣除匹配项
【发布时间】:2016-08-03 06:08:06
【问题描述】:

给定两个 csv 文件:

文件 1.csv SKU,描述,UPC 101,锯,101010103 102,钻头,101010102 103,螺丝,101010101 104、美甲、101010104 文件2.csv SKU,描述,UPC 100,光,101010105 101,锯,101010103 104、美甲、101010104 106,电池,101010106 108,桶,101010114

我想创建一个新的 csv 文件,我们将调用 UpdatedList.csv,其中包含 File1.csv 中的每个条目减去 SKU 在 File1.csv 和 File2.csv 中的任何行。在这种情况下,UpdatedList.csv 看起来像

更新列表.csv "SKU","描述","UPC" "102","钻头","101010102" "103","螺丝","101010101"

下面的代码会做我想做的事,但我相信有一种更有效的方法。我怎么能在没有循环的情况下做到这一点?我的代码如下。

#### Create a third file that has all elements of file 1 minus those in file 2 ###
$FileName1 = Get-FileName "C:\LowInventory"
$FileName2 = Get-FileName "C:\LowInventory"
$f1 = ipcsv $FileName1
$f2 = ipcsv $FileName2
$f3 = ipcsv $FileName1
For($i=0; $i -lt $f1.length; $i++){
For($j=0; $j -lt $f2.length; $j++){
if ($f1[$i].SKU -eq $f2[$j].SKU){$f3[$i].SKU = 0}
}
}
$f3 | Where-Object {$_.SKU -ne "0"} | epcsv "C:\LowInventory\UpdatedList.csv" -NoTypeInformation
Invoke-Item "C:\LowInventory\UpdatedList.csv"
################################

【问题讨论】:

    标签: csv powershell


    【解决方案1】:

    您可以利用 Group-Object cmdlet 做到这一点而无需循环:

    $f1 = ipcsv File1.csv;
    $f2 = ipcsv File2.csv;
    $f1.ForEach({Add-Member -InputObject $_ 'X' 0}) # So we can select these after
    $f1 + $f2                  | # merge our lists
        group SKU              | # group by SKU
        where {$_.Count -eq 1} | # select ones with unique SKU
        select -expand Group   | # ungroup
        where {$_.X -eq 0}       # where from file1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-15
      • 1970-01-01
      • 2014-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多