2016-11-08 95 views
0

下面您可以看到我的代碼。我試圖計算我的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

你目前的功能只輸出最後一行的平均值 - 你需要整個文件的結果嗎?或每行的結果?或者只是最後一行? –

回答

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問題;-)我不確定是否有一個「更容易」的方式,但我已經添加了一些註釋來解釋每個語句試圖完成什麼 –

0

如果您的數據分離器是在文件中的空間

解決方案1:

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

溶液2

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

解決方案3

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