Powershell — подсчет количества попаданий слов из списка в столбец CSV — важно нулевое значение

#powershell #csv #count

#powershell #csv #подсчет

Вопрос:

Я пытаюсь подсчитать, сколько раз список слов находится в столбце csv, где важно нулевое значение.

Этот код возвращает значение, только если слово находится в столбце csv, и я также хочу 0, если слова нет в столбце

  Import-Csv C:UsersWork_PCDocumentsTATJulyStock.csv -Header Animal | where {$_.Animal -in $searchTerms} | Group-Object Animal -NoElement
  

Примеры stock.csv

 Animal,Someothervalue,anothervalue,
Cow,1,2,
Sheep,1,3
Pig,1,4
Cow,1,2,
Sheep,1,3
Pig,1,4
Cow,1,2,
Cow,1,2,
Sheep,1,3
Pig,1,4
Cow,1,2,
  

пример $searchterms

 Cow
Sheep
Pig
Horse
Donkey
  

Использование приведенного выше кода возвращает это значение

  Count  Name
 -----  ----
     5  Cow
     3  Sheep
     3  Pig
  

Я хотел бы, чтобы он вернул

  Count  Name
 -----  ----
     5  Cow
     3  Sheep
     3  Pig
     0  Horse
     0  Donkey
  

Спасибо

Ответ №1:

Group-Object не будет перечислять элементы, о которых он не знает.

Лично я бы использовал список поисковых терминов для создания объектов и присвоения значений, это также позволяет учитывать дополнительные данные, если требуется:

 $SearchTerms = "Cow","Sheep","Pig","Horse","Donkey"

$GrpObjResults = Import-Csv C:UsersWork_PCDocumentsTATJulyStock.csv -Header Animal | where {$_.Animal -in $searchTerms} | Group-Object Animal -NoElement

$ObjProps = @{
    Name = [String]
    Count = [int]
}

$Results = @()

Foreach($Term in $SearchTerms){
    $ListEntry = New-Object -TypeName PSObject -Property $ObjProps
    $ListEntry.Name = $Term
    $ListEntry.Count = ($GrpObjResults | Where {$_.Name -eq $Term}).Count
    $Results  = $ListEntry
}

$Results
  

Это даст желаемый результат:

 Count Name  
----- ----  
    5 Cow   
    3 Sheep 
    3 Pig   
    0 Horse 
    0 Donkey
  

Ответ №2:

Из вашего примера видно, что в файле CSV уже есть заголовки, поэтому вы можете просто повторить условия поиска и выполнить Select-Object , чтобы получить то, что вы ищете:

 $searchTerms = 'Cow','Sheep','Pig','Horse','Donkey'
$csv = Import-Csv 'C:UsersWork_PCDocumentsTATJulyStock.csv'
foreach ($term in $searchTerms) {
    '' | Select-Object @{Name = 'Count'; Expression = {($csv | Where-Object {$_.Animal -eq $term}).Count}}, 
                       @{Name = 'Name'; Expression = {$term}}
}
  

Вывод:

Количество имен 
----- ---- 
 5 Корова 
 3 Овцы 
 3 Свинья 
 0 Лошадь 
 0 Осел