2016-10-05 24 views
0

我從時間表系統按照以下格式的CSV導出文件:PowerShell的數組操作

Paynum,Employee,Date,Time 
123,Joe Blogs,2016-07-10,08:37:29 
321,Ivor Notion,2016-07-10,08:39:31 
345,Herr Flick,2016-07-10,08:44:05 
321,Ivor Notion,2016-07-10,12:23:07 
345,Herr Flick,2016-07-10,12:24:15 
123,Joe Blogs,2016-07-10,13:03:49

我想要達到的輸出是:

Paynum,Employee,Date,Time#1,Time#2 
123,Joe Blogs,2016-07-10,08:37:29,13:03:49 
321,Ivor Notion,2016-07-10,08:39:31,12:23:07 
345,Herr Flick,2016-07-10,08:44:05,12:24:15

我已經加載樣品有:

$TimesheetData = @(Import-Csv $MergerFile) 

但現在我完全失去了for循環。

+0

你能後的for循環? – Richard

+0

我有一個foreach循環,但完全從那裏失去了陰謀。的foreach($在$ TimesheetData行){ \t $ row.Paynum \t $ row.Employee \t $ row.Date \t $ row.Time } – Dogeron

回答

0

使用Group-Object到組由員工CSV數據,然後從團體建立新的對象:

Import-Csv 'C:\path\to\input.csv' | Group-Object Employee | ForEach-Object { 
    $props = [ordered]@{ 
    Paynum = $_.Group[0].Paynum 
    Employee = $_.Group[0].Employee 
    Date  = $_.Group[0].Date 
    } 

    $i = 1 
    $_.Group | Select-Object -Expand Time | ForEach-Object { 
    $props["Time#$i"] = $_ 
    $i++ 
    } 

    New-Object -Type PSObject -Property $props 
} | Export-Csv 'C:\path\to\output.csv' -NoType 

如果記錄的數量可以從員工的不同員工的需要,以確保所有生成的記錄有相同數量的時間字段(或者至少第一個記錄具有最大數量的字段,即使它們中的一些或全部爲空),因爲PowerShell確定要由第一個對象在表格輸出中顯示的列。

您可以從分組的記錄確定時間字段的最大數量:

$csv  = Import-Csv 'C:\path\to\your.csv' | Group-Object Employee 
$timeCols = $csv | Select-Object -Expand Count | 
      Sort-Object | 
      Select-Object -Last 1 

,並使用for循環添加時間欄:

$times = $_.Group | Select-Object -Expand Time 
for ($i=1; $i -le $timeCols; $i++) { 
    $props["Time#$i"] = $times[$i] 
} 
+0

@ Ansgar Wiechers - 您的劇本完美運作。我發現我不需要再計算任何額外的時間,因爲該腳本將額外的列添加了「Time#」號碼。我發現通過添加額外的組項目(例如Manager = $ _。Group [0] .Manager),我可以處理任何額外的源列。我唯一的問題是我如何分組多天,以便每天都在自己的行? – Dogeron

+0

'組對象員工,日期' –

0
  1. 組由Paynum
  2. 排序每組由時間
  3. 採取第一項的組中
  4. 刪除Time
  5. 添加Time#1 =第一項的時間和Time#2 =第二項的時間

$merged = Import-Csv r:\1.csv | 
    Group Paynum | 
    ForEach { 
     $sorted = $_.Group | Sort Time 
     $sorted[0] | 
      Select * -ExcludeProperty Time | 
      Select *, 
        @{N='Time#1'; E={$sorted[0].Time}}, 
        @{N='Time#2'; E={$sorted[1].Time}} 
    } 
$merged | Export-Csv r:\2.csv -NoTypeInformation 
+0

腳本的作品完美,但另一種方法是爲球門柱更靈活一點現在已經移動 - 即使如此感謝您的幫助。 – Dogeron