2014-10-29 65 views
1

我有一个CSV文件,它看起来像如何获得由其他两个字段分组的CSV的平均值?

TAG_ONE, 11, 10/27/2014,12:00:00 AM,11,Alm Disabled 
TAG_ONE, 12, 10/27/2014,1:00:00 AM,11,Alm Disabled 
TAG_ONE, 15, 10/27/2014,2:00:00 AM,11,Alm Disabled 
TAG_ONE, 25, 10/27/2014,3:00:00 AM,11,Alm Disabled 
TAG_ONE, 76, 10/28/2014,12:00:00 AM,11,Alm Disabled 
TAG_TWO, 78, 10/27/2014,9:00:00 PM,11,Alm Disabled 
TAG_TWO, 79, 10/27/2014,10:00:00 PM,11,Alm Disabled 
TAG_TWO, 78, 10/27/2014,11:00:00 PM,11,Alm Disabled 
TAG_TWO, 45, 10/28/2014,12:00:00 AM,11,Alm Disabled 

我试图得到一个新的CSV文件,该文件按日期(第三列)和标签(第一列)的平均值在第二列的所有值。 因此,对于每个标签,对于每个日期,我会得到平均值的一行。 类似...

TAG_ONE, 15.75, 10/27/2014,12:00:00 AM,11,Alm Disabled 
TAG_ONE, 76, 10/28/2014,12:00:00 AM,11,Alm Disabled 
TAG_TWO, 78.33, 10/27/2014,12:00:00 AM,11,Alm Disabled 
TAG_TWO, 45, 10/28/2014,12:00:00 AM,11,Alm Disabled 

我是PowerShell的新手。我可以得到标签所有值的平均值,但不能让它们按日期分割,之后我无法确定如何从中创建新的csv文件。

最终目标是为大量标签获取大量数据点,并将每个标签每天转换为一个数据点。

以下是我到目前为止。我可以对这些项目进行分组并将它们显示回来,但我似乎无法弄清楚如何在分组后将所有的值平均分配出来。我得到一个错误,group.value无法找到,但如果我只是试图打印$ item.group.value,他们都打印得很好。

$csv = import-csv -path \\psf\Home\Desktop\GitHub\iFix_Polling\Testing\HourlyTest.csv -header 'tag','value','date','time','unknown','alarm' 

$collection = $csv | group-object -property tag,date 

foreach($item in $collection) {  
    $item | measure-object -property group.value -average 
} 
+1

如果您包含平均计算的代码,您将获得更少的损失。也许你几乎已经有了解决方案,你只需要社区来帮助其他人。现在看起来好像您正在寻找一种从零开始的解决方案,而不是这里的目标。 – Matt 2014-10-29 23:01:00

+0

你如何处理结果CSV?我建议你将这些数据导入到数据库中并在那里进行工作。 – 2014-10-29 23:09:31

+0

由于您是新手,我认为这是一个'我不知道我不知道的事情'的问题,并且您并不真正知道要查找什么,请使用以下cmdlet:Group-Object,Measure-Object,Add-成员,ForEach-Object,Select-Object和Export-CSV。运行Get-Help Group-Object -full并重复其他操作。这些都是我需要执行你想要的。 (除了Import-CSV,我假设你知道如何使用) – TheMadTechnician 2014-10-29 23:10:30

回答

2

我会给我两位。我会亲自将事物分组,然后为每个小组拿出第一个项目,添加一个小组的平均成员,然后只传递该项目。管道是一个选择,以获得您想要的属性,管一切以出口CSV:

$csv = import-csv -path \\psf\Home\Desktop\GitHub\iFix_Polling\Testing\HourlyTest.csv -header 'tag','value','date','time','unknown','alarm' 
$collection = $csv | group-object -property tag,date 
$collection | Foreach{ 
    $avg = $_.group|measure -Property Value -Average|select -expand average 
    add-member -inputobject $_.group[0] -notepropertyname 'Average' -notepropertyvalue $avg -PassThru 
}|Select Tag,Average,Date,SuperImportantNumber,AlarmStatus|Export-CSV $env:userprofile\desktop\Output.csv -notype 

你已经有大部分的数据都是一个对象,你想要的,没有太多的理由使甚至更多的对象是您已有的虚拟副本。

这会将输出csv放到桌面上。当然,您可以根据需要修改路径。

+0

添加成员是一个更好的主意....好的工作 – Matt 2014-10-30 02:15:10

+0

非常感谢你的帮助。现在我已经掌握了这方面的知识,可以更多地学习。我没有事先了解PowerShell脚本和一个不合理的截止日期而被抛弃。只是让自己面向所有人而已,如果没有尝试学习的奢侈,那就是压倒一切。 我修改了你给我的东西,准确地做我需要的东西。 再次感谢您。 – 2014-10-30 03:13:51

0

如果您只对标签,数据和价值感兴趣,这将很好地结合在一个简单的Select-Object

$data = Import-Csv e:\temp\data.txt -Header "Tag","Value","Date","Time","SuperImportantNumber","AlarmStatus" 
$data | Group-Object -Property tag,date | Select-Object @{Label ="Tag"; Expression ={($_.Name.split(","))[0]}}, 
     @{Label ="Average"; Expression ={ [math]::Round(($_.Group.Value | Measure-Object -Average).Average,2)}}, 
     @{Label ="Date"; Expression ={($_.Name.split(","))[1]}} 

否则你可以做这样的事情。不幸的是,它增加了比所需的更多的复杂性,但它仍然有效

$data = Import-Csv e:\temp\data.txt -Header "Tag","Value","Date","Time","SuperImportantNumber","AlarmStatus" 
$data | Group-Object -Property tag,date | ForEach-Object{ 
    $singleObject = $_.Group | Select -First 1 
    [pscustomobject][ordered]@{ 
     Tag = $singleObject.Tag 
     Average = [math]::Round(($_.Group.Value | Measure-Object -Average).Average,2) 
     Date = $singleObject.Date 
     Time = $singleObject.Time 
     SuperImportantNumber = $singleObject.SuperImportantNumber 
     AlarmStatus = $singleObject.AlarmStatus 
    } 
} | Export-Csv -Path c:\temp\results.csv -NoTypeInformation 

Group-Object是此代码的主要功能。使用它你可以收集一个组中的对象。在我们的例子中,我们使用tagdate来分组信息。首先虽然我们将数据导入为csv。你的样品没有标题,所以我为你提供了它们。如果您有自己的代码,则可以删除-Header,但请记住代码的其余部分取决于标头名称。对于创建的每个组,我们创建一个包含导入文件的所有字段的自定义对象。我们使用$singleObject = $_.Group | Select -First 1来获取标签,日期和平均值以外的值。就我个人而言,我没有看到在日期之后包含其他信息的理由,但是在输出中包含这些信息。平均值是从该组中的所有Values中计算出来的。 Measure-Object为我们做了平均,[math]方法Round给了我们2位小数。最后将它全部导出到csv。

相关问题