0

我是PowerShell的新手。目前我们需要一个 poweshell 脚本来比较两个大的(100000 行和 n 列(n > 300,列标题也是每个星期三对应的日期)。n 的值每周在文件中不断增加。我们需要比较文件(本周和上周),并且需要确保两个文件之间的唯一区别是最后一列。

我浏览了一些论坛和博客,但由于我的无知,我只能做很少的事情。

如果有办法从 powershell 中的 csv 文件中删除最后一列,我们可以使用下面的脚本在从本周文件中删除最后一列后比较前一周的文件和本周的文件。

如果有人可以用您来之不易的知识在这里帮助我,那将非常有帮助


[System.Collections.ArrayList]$file1Array = Get-Content "C:\Risk Management\ref_previous.csv"|Sort-Object
[System.Collections.ArrayList]$file2Array = Get-Content "C:\Risk Management\ref_current.csv"|Sort-Object
$matchingEntries = @()

foreach ($entry in $file1Array) {
    if ($file2Array.Contains($entry)) {
        $matchingEntries += $entry
        } 
    }
foreach ($entry in $matchingEntries){
    $file1Array.Remove($entry)
    $file2Array.Remove($entry)
    }

干杯,阿尼尔

4

3 回答 3

1

根据 alroc 给出的答案,您应该能够在 CSV 文件的第一行使用拆分操作来获取最后一列名称,然后在 -ExcludeProperty 参数上使用该操作。

但是,对此的比较对象命令对我不起作用,但它确实将正确的数据拉回每个变量中。

$CurrentFile = "C:\Temp\Current.csv"
$PreviousFile = "C:\Temp\Previous.csv"

$CurrentHeaders = gc $CurrentFile | Select -First 1
$CurrentHeadersSplit = $CurrentHeaders.Split(",")
$LastColumn = $CurrentHeadersSplit[-1] -Replace '"'

$Current = Import-Csv $CurrentFile | Select -Property * -ExcludeProperty $LastColumn | Sort-Object
$Previous = Import-Csv $PreviousFile | Sort-Object
Compare-Object $Current $Previous
于 2013-03-03T23:27:01.640 回答
1

假设您要排除的列名是LastCol(调整为您的实际列名):

$previous = Import-csv "C:\Risk Management\ref_previous.csv" | Select-Object -Property * -ExcludeProperty LastCol | Sort-Object;
$current = Import-csv "C:\Risk Management\ref_current.csv" | Sort-Object;
Compare-Object $previous $current;

这将从每个输入文件中删除最后一列,并指示剩余内容是否不同。

于 2013-03-03T20:32:46.147 回答
0

import-csv 和 export-csv 都提供了排除列的机会。

import-csv 具有 -header 选项,您只需命名传入的标题并排除最后一列标题。如果有 10 列,则仅命名 9。最后一列将被排除。

对于 export-csv,请选择您要写出的列 ( |select col1,col2,col3|export-csv... ),不要选择您要排除的列。

于 2013-03-04T16:02:15.517 回答