2016-10-05 5 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ループを持っていましたが、そこからプロットを完全に失いました。 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. TimeTime#1 =最初の項目の時間とTime#2 = 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