#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