比较2个.csv文件

时间:2018-08-13 08:18:12

标签: powershell csv compare

我有两个.csv文件,其中包含许多信息。如果句子的末尾是“ M”,则必须查看该行是否在另一个文件中。当它存在时,我必须查看行开头的代码是否相同,否则,我什么都不要做,但是当它相同时,我必须创建一个新文件。

这是我在其他文件中需要查看的信息:

Screenshot 1

您可以看到以下信息:

Screenshot 2

我也有在行尾带有“ B”的行,但这并不重要:

Screenshot 3

现在,当信息在这里时,我必须导出两个文件中相同的所有行。

我必须导出新文件中的行,这些行的开头具有相同的代码,用红色表示:

Screenshot 4

我尝试了各种在Internet上查找过的解决方案,但没有任何效果。

也许是这样吗?

$datenbank = Import-Csv "C:\Users\information1.csv"
$zentral = Import-Csv "C:\Users\information2.csv"
$new = ""

foreach ($line in $datenbank) {
    $Spalte = $line.Split(",")
    foreach ($z in $Zentral) {
        $found = $false
        foreach ($d in $Datenbanktyp) {
            if ($d.$Spalte[1] -eq $z.$Spalte[1]) {
                $found = $true
            }
        }
        if ($found -eq $true) {
            $new += $z
        }
    }
}

还是可以与if..elseif..else循环一起使用?

1 个答案:

答案 0 :(得分:0)

让我们看看我是否正确。您有一个文件,其中倒数第二列包含一个字母。如果该字母为“ M”,则要检查在此之前的列的值(部分)是否与第二个文件中的列匹配。如果是这样,则需要将第二个文件中第一行中与匹配行具有相同值的所有行导出到新文件。

由于您没有显示列名,因此我将复制第一个文件“ Erin”和“ Marty”中的倒数第三列和倒数第二列,第二个文件“ Pat”中的匹配列,以及第二个文件“ Gene”的第一列。

$datenbank | Where-Object {
    $_.Marty -ceq 'M'
} | Select-Object -Expand Erin -Unique | ForEach-Object {
    $outfile  = "export_${_}.csv"  # adjust output filename as you see fit
    $firstcol = $zentral |
                Where { $_.Pat -like "*${_}*" } |
                Select-Object -Expand Gene
    $zentral | Where-Object {
        $_.Gene -eq $firstcol
    } | Export-Csv $outfile
}

另一种方法是将第二个文件按第一列分组,然后检查这些分组是否包含匹配值。

$groups = $zentral | Group-Object Gene

$datenbank | Where-Object {
    $_.Marty -ceq 'M'
} | Select-Object -Expand Erin -Unique | ForEach-Object {
    $outfile  = "export_${_}.csv"  # adjust output filename as you see fit
    $groups | Where-Object {
        $_.Group.Pat -like "*${_}*"
    } | Select-Object -Expand Group | Export-Csv $outfile
}

“ Erin” “ Marty” “ Pat” “ Gene” 替换为实际CSV文件中的列标题。如果文件不包含列标题,则需要通过-Header的{​​{1}}参数进行指定,否则cmdlet会将第一数据行解释为标题。