2016-10-05 2 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

Вы можете разместить цикл? – Richard

+0

У меня был цикл 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 - Ваш скрипт отлично работает. Я обнаружил, что мне не нужно подсчитывать дополнительные времена, когда скрипт добавляет дополнительный столбец с номером «Время #». Я обнаружил добавление дополнительных элементов группы (например, 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

Смежные вопросы