我是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)
}
干杯, 阿尼尔
答案 0 :(得分: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;
这将删除每个输入文件的最后一列,并指出剩余内容是否不同。
答案 1 :(得分:1)
根据alroc给出的答案,您应该能够在CSV文件的第一行使用拆分操作获取最后一个列名,然后在-ExcludeProperty参数上使用它。
然而,对此的Compare-Object命令对我来说不起作用,但它确实将正确的数据拉回到每个变量中。
$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
答案 2 :(得分:0)
import-csv和export-csv都提供了排除列的机会。
import-csv具有-header选项,您只需为传入标头命名并排除最后一列标题。如果有10列,则只有名称9.最后一列将被排除。
对于export-csv,选择您要写出的列(| select col1,col2,col3 | export-csv ...),不要选择您要排除的列。