排除非'的单元格;t使用Powershell显示

排除非'的单元格;t使用Powershell显示,powershell,Powershell,我无法排除表中未显示的单元格。以下脚本允许显示ComputerName列中未显示的值,如果单元格与结果中未显示的值相匹配,则显示这些值 剧本: $csv = Import-Csv .\test1.csv -Delimiter ';' $ref = @($csv.ComputerName) foreach ($row in $csv) { foreach ($col in 'OtherComputerName', 'OtherComputer', 'AndAgain') { if (

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

剧本:

$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

你想要的是可能的,但我不推荐。在代码中,有行和列。其思想是一行中的数据是相关的

在您的数据中,您位于多个不同的列之后,其中一行中的数据不相关。因此,本质上,您需要的是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
输出:

$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

你的问题不清楚。“排除空单元格”是什么意思?要么排除整列,要么从结果中排除该行。这些值将被您的代码替换:
$row.$col='
预期结果为Up。您需要详细说明从输入数据获取预期结果所使用的标准。只是说“排除空单元”是没有意义的,因为你预期的结果在中间列中有一个空的单元。你使用的是什么版本的PuxS壳?V1.0 PosikSee ISI有一个错误:索引不可能在表中使用。Null@charlo我已更改顶行
$csv=…
以匹配您的代码。除此之外,我不知道为什么会出现错误;我在你的数据上测试了这一点。我知道,但是在这一行提供的错误是
“{0,-20}{1,-20}{2,-20}”-f$OtherComputerName[$I],$OtherComputer[$I],$AndAgain[$I]
@charlo你是否使用了具有不同列标题的输入?不,我只是复制了你的代码来检查并更改了文件名,如果是问题,我没有触及文件的内容。