Powershell 从CSV获取每个列的平均值
我试图得到CSV中所有列的时间戳平均值。对象类型为system.array。每当我尝试转换整数时,它都会显示一个错误 timestamp streams TRP A B C D 6/4/2019 6775 305 56 229 132 764 6/4/2019 6910 316 28 356 118 134 6/4/2019 6749 316 54 218 206 144 6/5/2019 5186 267 84 280 452 258 6/5/2019 5187 240 33 436 455 245 6/5/2019 5224 291 21 245 192 654 6/6/2019 5254 343 42 636 403 789 6/6/2019 5180 252 23 169 328 888 6/6/2019 5181 290 32 788 129 745 6/6/2019 5244 328 44 540 403 989Powershell 从CSV获取每个列的平均值,powershell,Powershell,我试图得到CSV中所有列的时间戳平均值。对象类型为system.array。每当我尝试转换整数时,它都会显示一个错误 timestamp streams TRP A B C D 6/4/2019 6775 305 56 229 132 764 6/4/2019 6910 316 28 356 118 134 6/4/2019 6749 316 54 218 206 144 6/5/2019 5186 267 84 280
也许有一个更好的方法可以做到这一点,李肯定会建议,但这就是我将如何完成任务。这将根据
Timestamp
属性对对象进行分组,然后您可以在那里对它们进行平均。我建议大家玩玩$csv | Group Object timestamp
,看看能用它做些什么
$csv = import-csv C:\temp\test.csv
$Averages = New-Object System.Collections.ArrayList
Foreach($object in ($csv | Group-Object timestamp)) {
$Averages.Add([pscustomobject]@{
timestamp = $object.Name
abc = ($object.group | Select-Object -ExpandProperty abc | Measure-Object -Average).Average
a = ($object.group | Select-Object -ExpandProperty a | Measure-Object -Average).Average
b = ($object.group | Select-Object -ExpandProperty b | Measure-Object -Average).Average
c = ($object.group | Select-Object -ExpandProperty c | Measure-Object -Average).Average
d = ($object.group | Select-Object -ExpandProperty d | Measure-Object -Average).Average
e = ($object.group | Select-Object -ExpandProperty e | Measure-Object -Average).Average
f = ($object.group | Select-Object -ExpandProperty f | Measure-Object -Average).Average
g = ($object.group | Select-Object -ExpandProperty g | Measure-Object -Average).Average
})
}
输出:
PS H:\> $Averages
timestamp : 6/4/2019
abc : 6811.33333333333
a : 3129
b : 10.6666666666667
c : 2680
d : 1522.66666666667
e : 1184
f : 0
g : 9.33333333333333
timestamp : 6/5/2019
abc : 6783.33333333333
a : 3098
b : 6.66666666666667
c : 2698.66666666667
d : 1320
e : 686.666666666667
f : 0
g : 1.33333333333333
下面是一种处理您在新数据集中呈现的有点损坏的CSV文件的方法。[grin]它以纯文本形式读取文件,删除空格,并修剪最后的
我想知道分组中只有一个日期是否是一个问题,所以我在数据集中添加了一个日期不同的最后一行
# fake reading in a defective CSV file as plain text
# in real life, use Get-Content
$InStuff = @'
timestamp|abc | A | B | C | D | E | F | G |
6/4/2019 |6775 | 3059 | 4 | 2292 | 1328 | 764 | 0 | 0 |
6/4/2019 |6910 | 3167 | 28 | 3568 | 1180 | 1348 | 0 | 0 |
6/4/2019 |6749 | 3161 | 0 | 2180 | 2060 | 1440 | 0 | 28 |
6/5/2019 |6738 | 3118 | 4 | 2736 | 1396 | 984 | 0 | 0 |
6/5/2019 |6718 | 3130 | 12 | 3076 | 1008 | 452 | 0 | 4 |
6/5/2019 |6894 | 3046 | 4 | 2284 | 1556 | 624 | 0 | 0 |
1/1/2021 |1111 | 2222 | 3 | 4444 | 5555 | 666 | 7 | 8 |
'@ -split [System.Environment]::NewLine
$CleanedInStuff = $InStuff.ForEach({$_.Replace(' ', '').Trim('|')}) |
ConvertFrom-Csv -Delimiter '|'
$TargetPropertyList = $CleanedInStuff[0].PSObject.Properties.Name.
Where({
$_ -ne 'TimeStamp'
})
$GroupedCIS = $CleanedInStuff |
Group-Object -Property TimeStamp
$Results = foreach ($GCIS_Item in $GroupedCIS) {
$TempObject = [ordered]@{
TimeStamp = $GCIS_Item.Name
}
foreach ($TPL_Item in $TargetPropertyList) {
$TempAveValue = [Math]::Round(($GCIS_Item.Group.$TPL_Item.
ForEach({[int]$_}) |
Measure-Object -Average).Average, 2)
$TempObject.Add($TPL_Item, $TempAveValue)
}
[PSCustomObject]$TempObject
}
$Results = $Results |
Sort-Object -Property {
[DateTime]$_.TimeStamp
}
$Results
输出
TimeStamp : 6/4/2019
abc : 6811.33
A : 3129
B : 10.67
C : 2680
D : 1522.67
E : 1184
F : 0
G : 9.33
TimeStamp : 6/5/2019
abc : 6783.33
A : 3098
B : 6.67
C : 2698.67
D : 1320
E : 686.67
F : 0
G : 1.33
TimeStamp : 1/1/2021
abc : 1111
A : 2222
B : 3
C : 4444
D : 5555
E : 666
F : 7
G : 8
我创建的cmdlet实际上应该读取固定宽度的列表,但没有任何理由说明它不能同时读取分隔(或扭曲)的表。所以这个问题鼓励我创建一个更新,当这种情况发生时,它不再产生错误
转换问题中的表格
带垂直标尺的固定宽度列表
注意结果中的类型转换(表对齐),这意味着结果是对称的:$Result=$Table | ConvertFrom SourceTable | Format Table
$Result |格式表
$Result |从源表转换|格式表
变形表
请注意,扭曲的行总是会导致文字(字符串)转换(无类型转换)@Lee_Dailey-我已经发布了新问题。我无法获得我尝试的期望输出。但是没有运气当我运行该代码时,它与您提供的示例数据一起工作。[grin]另外,我设法去掉了
,2
,它应该结束$TempHiVal=
行-你发布的代码给出整数-添加了,2
你得到了1.33
,而不是2019年6月5日
行的G
列的1
所以[1] 什么是完整错误消息-它通常包括行号。[2] 您发布的代码是否与您发布在系统上的示例数据兼容?嗨,lee,@lee_Dailey我实际上正在尝试导入csv,它与示例数据兼容,但与csv不兼容。我认为这与数据类型转换有关。尝试将对象输出到屏幕,并将错误设置为“停止”。otta让你看到触发故障的数据。如果你能告诉我,那么我可以添加一个过滤器删除或忽略它。也许只要“删除所有非数字”就可以了,但我想确定问题出在哪里。[grin]CSV是纯文本格式。请显示原始CSV数据(使用文本编辑器打开文件并复制/粘贴文本),而不是在Excel中打开文件时看到的内容。话虽如此,您所得到的错误表明您的数据中有一个带有虚假空白的字段。哈哈!OP显示的代码实际上与提供的数据集一起工作。我怀疑问题在于正在使用的真实数据集。经典的是,我甚至没有用提供的示例运行原始数据集。CSV数据可能是字符串而不是int,这是我的老兄。是的,OP需要显示出现故障的数据样本。添加筛选器以删除非数字很容易。。。但当前数据集不需要。Hi@Lee_Dailey,它仍然显示相同的错误。我不确定我错过了什么。无法将值“”转换为类型“System.Int32”。错误:“索引超出了数组的边界。”@BijoDev-[1]您是否使用Get Content
读取了文件,并让清理代码删除了空格?[2] 在$cleanedStuff
和$TargetPropertyList
中显示了什么?[3] 同一行是否有错误?[4] 您是使用了我的精确代码还是修改了以前的代码?我的数据是CSV格式的,我展示的示例数据只是为了对其进行结构分析。所以我没有使用变量$CleanedStuff,因为我正在指导从CSV文件导入它。但是它仍然显示错误。很抱歉,实际上我试图从csv复制数据。但它的格式不正确。这就是我添加这些delimeters以表格形式订购的原因:(@BijoDev-不要费心把它弄得漂亮。只需发布真实的数据。没有人能够准确地为与示例数据不匹配的内容编写脚本。
TimeStamp : 6/4/2019
abc : 6811.33
A : 3129
B : 10.67
C : 2680
D : 1522.67
E : 1184
F : 0
G : 9.33
TimeStamp : 6/5/2019
abc : 6783.33
A : 3098
B : 6.67
C : 2698.67
D : 1320
E : 686.67
F : 0
G : 1.33
TimeStamp : 1/1/2021
abc : 1111
A : 2222
B : 3
C : 4444
D : 5555
E : 666
F : 7
G : 8
$Table = '
timestamp streams TRP A B C D
6/4/2019 6775 305 56 229 132 764
6/4/2019 6910 316 28 356 118 134
6/4/2019 6749 316 54 218 206 144
6/5/2019 5186 267 84 280 452 258
6/5/2019 5187 240 33 436 455 245
6/5/2019 5224 291 21 245 192 654
6/6/2019 5254 343 42 636 403 789
6/6/2019 5180 252 23 169 328 888
6/6/2019 5181 290 32 788 129 745
6/6/2019 5244 328 44 540 403 989
'
# Raw Table
ConvertFrom-SourceTable $Table | Format-Table
timestamp streams TRP A B C D
--------- ------- --- - - - -
6/4/2019 6775 305 56 229 132 764
6/4/2019 6910 316 28 356 118 134
6/4/2019 6749 316 54 218 206 144
6/5/2019 5186 267 84 280 452 258
6/5/2019 5187 240 33 436 455 245
6/5/2019 5224 291 21 245 192 654
6/6/2019 5254 343 42 636 403 789
6/6/2019 5180 252 23 169 328 888
6/6/2019 5181 290 32 788 129 745
6/6/2019 5244 328 44 540 403 989
#Streamed rows from pipeline:
$Table -split [System.Environment]::NewLine | ConvertFrom-SourceTable | Format-Table
timestamp streams TRP A B C D
--------- ------- --- - - - -
6/4/2019 6775 305 56 229 132 764
6/4/2019 6910 316 28 356 118 134
6/4/2019 6749 316 54 218 206 144
6/5/2019 5186 267 84 280 452 258
6/5/2019 5187 240 33 436 455 245
6/5/2019 5224 291 21 245 192 654
6/6/2019 5254 343 42 636 403 789
6/6/2019 5180 252 23 169 328 888
6/6/2019 5181 290 32 788 129 745
6/6/2019 5244 328 44 540 403 989
$Table = '
| date | abc | A | B | C | D | E | F | G |
| 6/4/2019 | 6775 | 3059 | 4 | 2292 | 1328 | 764 | 0 | 0 |
| 6/4/2019 | 6910 | 3167 | 28 | 3568 | 1180 | 1348 | 0 | 0 |
| 6/4/2019 | 6749 | 3161 | 0 | 2180 | 2060 | 1440 | 0 | 28 |
| 6/5/2019 | 6738 | 3118 | 4 | 2736 | 1396 | 984 | 0 | 0 |
| 6/5/2019 | 6718 | 3130 | 12 | 3076 | 1008 | 452 | 0 | 4 |
| 6/5/2019 | 6894 | 3046 | 4 | 2284 | 1556 | 624 | 0 | 0 |
| 1/1/2021 | 1111 | 2222 | 3 | 4444 | 5555 | 666 | 7 | 8 |
'
# Raw Table
ConvertFrom-SourceTable $Table | Format-Table
date abc A B C D E F G
---- --- - - - - - - -
6/4/2019 6775 3059 4 2292 1328 764 0 0
6/4/2019 6910 3167 28 3568 1180 1348 0 0
6/4/2019 6749 3161 0 2180 2060 1440 0 28
6/5/2019 6738 3118 4 2736 1396 984 0 0
6/5/2019 6718 3130 12 3076 1008 452 0 4
6/5/2019 6894 3046 4 2284 1556 624 0 0
1/1/2021 1111 2222 3 4444 5555 666 7 8
#Streamed rows from pipeline:
$Table -split [System.Environment]::NewLine | ConvertFrom-SourceTable | Format-Table
date abc A B C D E F G
---- --- - - - - - - -
6/4/2019 6775 3059 4 2292 1328 764 0 0
6/4/2019 6910 3167 28 3568 1180 1348 0 0
6/4/2019 6749 3161 0 2180 2060 1440 0 28
6/5/2019 6738 3118 4 2736 1396 984 0 0
6/5/2019 6718 3130 12 3076 1008 452 0 4
6/5/2019 6894 3046 4 2284 1556 624 0 0
1/1/2021 1111 2222 3 4444 5555 666 7 8
$Table = '
timestamp|abc | A | B | C | D | E | F | G |
6/4/2019 |6775 | 3059 | 4 | 2292 | 1328 | 764 | 0 | 0 |
6/4/2019 |6910 | 3167 | 28 | 3568 | 1180 | 1348 | 0 | 0 |
6/4/2019 |6749 | 3161 | 0 | 2180 | 2060 | 1440 | 0 | 28 |
6/5/2019 |6738 | 3118 | 4 | 2736 | 1396 | 984 | 0 | 0 |
6/5/2019 |6718 | 3130 | 12 | 3076 | 1008 | 452 | 0 | 4 |
6/5/2019 |6894 | 3046 | 4 | 2284 | 1556 | 624 | 0 | 0 |
1/1/2021 |1111 | 2222 | 3 | 4444 | 5555 | 666 | 7 | 8 |
'
# Raw Table
ConvertFrom-SourceTable $Table | Format-Table
timestamp abc A B C D E F G
--------- --- - - - - - - -
6/4/2019 6775 3059 4 2292 1328 764 0 0
6/4/2019 6910 3167 28 3568 1180 1348 0 0
6/4/2019 6749 3161 0 2180 2060 1440 0 28
6/5/2019 6738 3118 4 2736 1396 984 0 0
6/5/2019 6718 3130 12 3076 1008 452 0 4
6/5/2019 6894 3046 4 2284 1556 624 0 0
1/1/2021 1111 2222 3 4444 5555 666 7 8
#Streamed rows from pipeline:
$Table -split [System.Environment]::NewLine | ConvertFrom-SourceTable | Format-Table
timestamp abc A B C D E F G
--------- --- - - - - - - -
6/4/2019 6775 3059 4 2292 1328 764 0 0
6/4/2019 6910 3167 28 3568 1180 1348 0 0
6/4/2019 6749 3161 0 2180 2060 1440 0 28
6/5/2019 6738 3118 4 2736 1396 984 0 0
6/5/2019 6718 3130 12 3076 1008 452 0 4
6/5/2019 6894 3046 4 2284 1556 624 0 0
1/1/2021 1111 2222 3 4444 5555 666 7 8