比较两个CSV文件并将缺少的条目从第2个追加到第1个

时间:2016-10-31 12:23:35

标签: powershell csv compare append

我正在尝试使用'user Id'列来比较2个csv文件,这两个文件在这两个文件中都很常见,并希望使用power shell从csv 2中附加csv 1中的缺失条目

1 个答案:

答案 0 :(得分:0)

如果第一个CSV文件缺少行,则需要直接从第二个CSV文件中复制它们:

ipcsv 2.csv |? 'User Id' -notin (ipcsv 1.csv).'User Id' | epcsv 1.csv -Append

如果您还说文件中的用户ID是唯一的,您可以将两个CSV集中的唯一行转换为第一个CSV:

(ipcsv 1.csv, 2.csv) | sort -Unique 'User Id' | epcsv 1.csv -NoTypeInformation

或者,如果您说文件具有相同的用户ID但没有相同的其他列,并且第一个CSV中的条目存在但有一些空列,则:

$csv1 = Import-Csv d:\file1.csv
$csv2 = Import-Csv d:\file2.csv

foreach ($csv1item in $csv1)
{
    $csv2item = $csv2.Where{$_.'User Id' -eq $csv1item.'User Id'}

    $item1Properties = $csv1item | Get-Member -MemberType NoteProperty | select -ExpandProperty Name
    $item2Properties = $csv2item | Get-Member -MemberType NoteProperty | select -ExpandProperty Name
    $sharedProperties = $item1Properties.where{$_ -in $item2Properties}

    $sharedProperties | ForEach-Object {

        $value = $csv1item."$_"
        if ($value -eq '') {
            $csv1item."$_" = $csv2item."$_"
        }
    }
}

$csv1 | Export-Csv D:\file1.csv -NoTypeInformation

或者,如果你说这两个文件有不同的列,这些列在“用户ID”处重叠,并且第一个CSV中的条目完全丢失,而不是出现缺少的列,那么这将从第二个CSV,只采用它们之间重叠的属性(希望如此):

$csv1 = Import-Csv d:\file1.csv
$csv2 = Import-Csv d:\file2.csv

$item1Properties = ($csv1[0] | gm -M NoteProperty).Name

$newCsv1Items = foreach($csv2item in $csv2.Where{$csv1.'User Id' -notcontains $_.'User ID'}) {

    $newcsv1Item = @{}
    $item1Properties.ForEach{$newcsv1Item."$_" = $csv2item."$_"}
    [PSCustomObject]$newcsv1Item

}

$newCsv1Items | Export-Csv -Append D:\file1.csv