Powershell 从CSV获取每个列的平均值

Powershell 从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

我试图得到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 989
也许有一个更好的方法可以做到这一点,李肯定会建议,但这就是我将如何完成任务。这将根据
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