Почему мое пользовательское свойство powershell равно нулю после чтения в этом CSV-файле?

#powershell #csv #class

#powershell #csv #класс

Вопрос:

Учитывая приведенный ниже код, если какой-либо статус в моем CSV-файле появляется ровно 1 раз, значение для свойства ‘num’ будет «пустым» вместо ‘1’. Теперь, если в файле CSV есть по крайней мере два одинаковых состояния, значение свойства ‘num’ будет равно ‘2’. Наконец, если в файле CSV НЕТ экземпляров данного статуса, значение свойства ‘num’ будет равно ‘0’. Мне трудно отлаживать, почему один экземпляр не отображается корректно в значении свойства ‘num’?

 $DataSource = "foo.csv"

Class PieChartClass {
    $Status
    $Num
}
    
$Statuses = 'Installed', 'Decommissioned', 'In Stock', 'Removed'

$Results = {}.Invoke()

Foreach($Status in $Statuses){
    $Computers = Get-Content $ServiceNowDataSource | ConvertFrom-Csv | Where-Object {$_.install_status -eq $Status}
    $Result = [PieChartClass]::new()
    $Result.Status = $Status
    $Result.Num = $Computers.count
    $Results.Add($Result)
}

$Results
  

Структура файла CSV выглядит следующим образом:

 "name","asset","discovery_source","install_status"
"pc001","laptop","foo","Decommissioned"
"pc002","laptop","foo","Installed"
"pc003","tablet","foo","Installed"
"pc004","tablet","bar","Installed"
"pc005","laptop","bar","Decommissioned"
"pc006","desktop","bar","Removed"
  

Значение $Results для данного CSV-файла равно:

 Status         Num
------         ---
Installed        3
Decommissioned   2
In Stock         0
Removed
  

Почему в мире отображается «Удалено» [ПУСТО]?

Я ценю любое понимание этой ошибки.

Комментарии:

1. шум, поскольку $ServiceNowDataSource отличается от $Datasource, может быть

Ответ №1:

Я предлагаю вам другой метод :

 Class PieChartClass {
    $Status
    $Num
}

$Statuses = 'Installed', 'Decommissioned', 'In Stock', 'Removed'

#Import data and group by install_status, better in perf because you dont load to every loop
$Results=import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | %{
$Result = [PieChartClass]::new()
$Result.Status = $_.Name
$Result.Num = $_.Group.count
$Result
}

#for add element with 0 elements
$Statuses | where {$_ -notin $Results.Status} | %{
$Result = [PieChartClass]::new()
$Result.Status = $_
$Result.Num = 0
$Results =$Result
}

$Results
  

Комментарии:

1. Спасибо за вашу помощь. Ваше предложение здесь сработает. Просто хотелось бы понять, почему это не сработало с самого начала. Это не имело никакого отношения к имени переменной, как указано выше, поскольку это была просто опечатка от моего имени. Но я все равно рад, что это то, что я искал.

Ответ №2:

Если нет необходимости иметь PieChartClass и пустые элементы install_status, вы можете легко это сделать :

 import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | %{[pscustomobject]@{Status=$_.Name;Num=$_.Group.count}}
  

или лучше

 import-csv "c:tempfoo.csv" -Delimiter "," | group install_status | select Name, Count