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
您可以访问每一行的属性(不知道他们的名字)通过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
谢谢!这是我正在寻找的。尽管我在PowerShell中还是个新手,但我不知道函数内部会发生什么。有没有更容易的代码形式,我可以把它放在foreach? Bedankt voor alle hulp :)! – SkullNerd
@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) }
您可以添加语言标签吗? –
是的抱歉,我一直在试图找到如何做到这一点:x它的PowerShell – SkullNerd
你目前的功能只输出最后一行的平均值 - 你需要整个文件的结果吗?或每行的结果?或者只是最后一行? –