Powershell - 尝试使用函数计算csv文件的平均值

问题描述:

下面您可以看到我的代码。我试图计算我的csv文件的平均线。我能做到这一点的唯一方法就是将它用作数组。我的问题是,有没有办法通过函数传递每一行,以便我不必创建多个函数?Powershell - 尝试使用函数计算csv文件的平均值

文件看起来是这样的:

V1 V2 V3 
5 9 3 
5 6 2 

脚本:

Function Average($a) { 

     Foreach ($line in $a) { 
      $total = [int]$a[0].V1 + [int]$a[0].V2 + [int]$a[0].V3 
     } 
     return "The Average is $($total/3)" 
    } 


    #Variables 

    $a = (Import-Csv "Document.csv") 

    #Logic 

    Average 
+0

您可以添加语言标签吗? –

+0

是的抱歉,我一直在试图找到如何做到这一点:x它的PowerShell – SkullNerd

+0

你目前的功能只输出最后一行的平均值 - 你需要整个文件的结果吗?或每行的结果?或者只是最后一行? –

您可以访问每一行的属性(不知道他们的名字)通过psobject参考:

function Get-CsvAverage 
{ 
    param(
     [psobject[]]$Lines 
    ) 

    # Loop through all lines of input 
    foreach($Line in $Lines){ 
     # For each "line" object, loop through its properties 
     $Numbers = $Line.psobject.Properties |ForEach-Object { 
      # Attempt to cast the property's value as an integer 
      $_.Value -as [int] 
     } 

     # Output the average for the current line 
     Write-Output ($numbers | Measure-Object -Average).Average 
    } 
} 

然后像这样使用:

$CsvLines = Import-Csv Document.csv 
Get-CsvAverage $CsvLines 

为您的样品输入,这将产生:

5.66666666666667 
4.33333333333333 
+0

谢谢!这是我正在寻找的。尽管我在PowerShell中还是个新手,但我不知道函数内部会发生什么。有没有更容易的代码形式,我可以把它放在foreach? Bedankt voor alle hulp :)! – SkullNerd

+0

@SkullNerd Geen问题;-)我不确定是否有一个“更容易”的方式,但我已经添加了一些注释来解释每个语句试图完成什么 –

如果您的数据分离器是在文件中的空间

解决方案1:

import-csv C:\temp\test.csv -Delimiter ' ' | select @{Name="Average";Expression={[math]::Round(([Decimal]$_.V1 + [Decimal]$_.V2 + [Decimal]$_.V3)/3, 2)}} 

溶液2

import-csv C:\temp\test.csv -Delimiter ' ' | %{[math]::Round(([Decimal]$_.V1 + [Decimal]$_.V2 + [Decimal]$_.V3)/3, 2)} 

解决方案3

Get-Content C:\temp\test.csv | select -Skip 1 | %{$avg=0; $_ -split " " | %{$avg+=[decimal]$_};[math]::Round($avg/3, 2) }