排除未使用Powershell

时间:2017-06-20 07:58:59

标签: powershell

我无法排除未在我的表格中显示的单元格。以下脚本允许显示不在ComputerName列中的值,如果单元格匹配,则结果中不会显示这些值。 / p>

脚本:

$csv = Import-Csv .\test1.csv -Delimiter ';'

$ref = @($csv.ComputerName)
foreach ($row in $csv) {
  foreach ($col in 'OtherComputerName', 'OtherComputer', 'AndAgain') {
    if ($ref -contains $row.$col) { $row.$col = '' }
  }
}


$csv | Select-Object * -ExcludeProperty ComputerName |Format-Table -auto

文件:

ComputerName    OtherComputerName   OtherComputer   AndAgain
infra-1         infra-852           infra-2         infra-99
infra-98        infra-85            infra-44        infra-23
infra-5         infra-8             infra-1         infra-10
infra-2         infra-55            infra-8         infra-70
infra-62        infra-5             infra-852       infra-5

结果:

OtherComputerName OtherComputer AndAgain
----------------- ------------- --------
infra-852                       infra-99
infra-85          infra-44      infra-23
infra-8                         infra-10
infra-55          infra-8       infra-70
                  infra-852         

我想排除空单元格,但我不知道这些值是否存在但是没有显示,有人可以帮我吗?

预期结果:

OtherComputerName OtherComputer AndAgain
----------------- ------------- --------
infra-852           infra-44     infra-99
infra-85            infra-8      infra-23
infra-8             infra-852    infra-10
infra-55                         infra-70

1 个答案:

答案 0 :(得分:1)

你想要什么是可能的,但我不推荐它。在您的代码中,您有。这个想法是沿着一行的数据是相关的。

在您的数据中,您处于几个不同的列之后,其中数据与行无关。所以基本上你是在3个不同的列表之后,而不是表格。

我建议您创建不同的结果列表。有很多方法可以做到这一点;我通过创建一个具有列标题名称的变量来完成它。

之后,如果您愿意,可以手动将值显示为表格。

输入 - test1.csv

ComputerName;OtherComputerName;OtherComputer;AndAgain
infra-1;infra-852;infra-2;infra-99
infra-98;infra-85;infra-44;infra-23
infra-5;infra-8;infra-1;infra-10
infra-2;infra-55;infra-8;infra-70
infra-62;infra-5;infra-852;infra-5

<强>代码:

$csv = Import-Csv .\test1.csv -Delimiter ';'

$ref = @($csv.ComputerName)

# get csv headers; exclude computername
$myheaders = ($csv | Get-Member | Where-Object {$_.MemberType -eq "NoteProperty" -and $_.Name -ne "ComputerName"}).Name


$j = 0 # a counter

foreach ($col in $myheaders){

    # create a new variable that has the name of the column, and the value
    # that you are after (in column but not in $ref)
    New-Variable -Name $col -Value ($csv.$col | Where-Object {$_ -notin $ref})

    $k++
    if($k -gt $j){$j++} # get the longest column

}

# output formatted text, with left justified test that is 20 characters long.
# 0,1 and 2 are indexes that refer to the values after -f

"{0,-20}{1,-20}{2,-20}" -f "OtherComputerName","OtherComputer","AndAgain"
foreach($i in 0..$j){
    "{0,-20}{1,-20}{2,-20}" -f $OtherComputerName[$i],$OtherComputer[$i],$AndAgain[$i]
}

<强>输出:

OtherComputerName   OtherComputer       AndAgain
infra-852           infra-44            infra-99
infra-85            infra-8             infra-23
infra-8             infra-852           infra-10
infra-55                                infra-70