拆分数组列并将结果分成额外的Colums

时间:2019-03-27 10:39:09

标签: powershell

我有一个表格(CSV),其中显示了曾经登录到一堆计算机的所有用户。用户可以有2个帐户,一个用户名以“ a”开头,另一个用户名以“ b”开头,例如a100和b100(后面的用户是同一个人)。

现在,我需要获得登录了两个以上帐户且不属于同一用户的计算机。因此,A64和B64不会报告为单独的用户。

这是我的基本清单:

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6

我的计划是将“用户”列拆分为更多列,因此表如下所示:

Computername,user1,user2,user3,user4,UserX

完成此操作后,我可以遍历表并删除用户名中的前导字母,然后尝试摆脱双打。

您认为这有意义吗?

现在我已经陷入了第一个任务。我知道如何遍历第二列,但是如何设法将结果放入另一个数组中,所以输出将像这样:

Computername,user1,user2,user3,user4,UserX

你能帮我分开吗?

$UserComputers = import-csv -Delimiter ";" "input.csv" -Header 
'Computername','user1','user2','user3','user4'


$UserComputers | Select-Object *,
    @{n='User1';e={$_.User1.Split(',')[0]}},
    @{n='User2';e={$_.User1.Split(',')[1]}} 

我收到错误消息:Select-Object:无法处理该属性,因为属性“ User1”已经存在。

3 个答案:

答案 0 :(得分:2)

使“用户”成为数组很有用。

Get-Content "input.csv" | foreach {
    $name, $users = $_.Split(",")
    [pscustomobject]@{ Name = $name; Users = $users }
} | Where-Object { ($_.Users.Substring(1) | Select-Object -Unique).Count -gt 2 }

输出如下。

Name Users               
---- -----               
PC1  {A64, B52, B64, A41}
PC2  {A51, B42, B51, A23}
PC3  {A42, B51}          
PC5  {A1, B1, A14, A6} 

答案 1 :(得分:1)

输入文件(input.csv)

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6

Powershell脚本

Get-Content -Path .\input.csv | 
Select-Object @{ Name = "Computer"; Expression = { $_.Split(',')[0] } }, 
              @{ Name="Users"; Expression = { $_.Split(',')[1..($_.Split(',').Length-1)] | 
Foreach-Object { $_.Substring(1) } | Select-Object -Unique } } | 
Where-Object { $_.Users.Count -gt 2 }

结果:

Computer      Users
------------- -----
PC1      {64, 52, 41}
PC2      {51, 42, 23}
PC5      {1, 14, 6}  

P.S。奖励:如果要在屏幕上查看数组的四个以上元素,请更改变量     $FormatEnumerationLimit = 20 Explanation of the variable meaning

答案 2 :(得分:0)

如果文件类似于基本列表,则可以执行以下操作来构建包含所需所有列的新文件:

$maxColCount = 0
$data = get-content input.csv
foreach ($line in $data) {
   $MaxColCount = [math]::Max($maxcolcount,($line -split ",").count)
}

$headers = @("ComputerName")
$MaxUserCount = $MaxColCount - 1
Foreach ($c in (1..$MaxUserCount)) {
   $Headers += "User$c"
}
$Headers = $Headers -join ","

$Headers,$data | Set-Content "output.csv"

上面的代码假定input.csv具有以下格式,并且第一列之后的每一列都是用户:

PC1,A64,B52,B64,A41
PC2,A51,B42,B51,A23
PC3,A42,B51
PC4,A5,B5
PC5,A1,B1,A14,A6