2014-10-29 63 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。

相關問題