0

この質問の一番下にあるxmlに似たデータがあります。これは数千のタスクのうちの 3 つです。ノードがあるもの<DayOfWeek>とないものがあります。私はこのデータを取得してcsvに入れ、SQLにインポートできるように取り組んでいます。

私の目標は、毎日がテーブルの列になり、各行がタスクを表すようにすることです。特定の日に実行するようにスケジュールされている場合は、それぞれの日に 1 になり、そうでない場合は 0 になります。この質問の下部にある以下のデータの場合、表は次のようになります。

| taskID | mon | tue | wed | thur | fri | sat | sun |
|________|_____|_____|_____|______|_____|_____|_____|
|    1   |  1  |  0  |  0  |  1   |  1  |  1  |  0  |
|    2   |  1  |  0  |  0  |  0   |  1  |  0  |  0  |
|    3   |  1  |  1  |  1  |  1   |  1  |  1  |  1  |

私の現在の ps スクリプトは、このデータを水平ではなく垂直にします。コードからの抜粋

foreach($task in $config.Settings.Tasks.Task){
    $taskID = $task.ID
    foreach($DoW in $task.Schedules.Schedule.Days.DayOfWeek){
        $newCSV += @(New-Object -TypeName psobject -Property @{'taskID' = $taskID; 'Day' = $DoW})
    }
}
$newCSV | Export-Csv -Path c:\users\mhopkins\desktop\micSchedule\DoW.csv -notype

このデータをテーブルでもう少しうまく機能させるのを手伝ってくれませんか?

XML スニピット

<Task ID="1" Name="name1" Active="1" NextEID="11">
    <Schedules>
        <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="0">
            <Days>
                <DayOfWeek>Monday</DayOfWeek>
                <DayOfWeek>Friday</DayOfWeek>
                <DayOfWeek>Thursday</DayOfWeek>
                <DayOfWeek>Saturday</DayOfWeek>
            </Days>
        </Schedule>
    </Schedules>
</Task>
<Task ID="2" Name="name2" Active="1" NextEID="12">
    <Schedules>
        <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="0">
            <Days>
                <DayOfWeek>Monday</DayOfWeek>
                <DayOfWeek>Friday</DayOfWeek>
            </Days>
        </Schedule>
    </Schedules>
</Task>
<Task ID="3" Name="name3" Active="0" NextEID="24" TT="COS" AR="0">
    <Schedules>
        <Schedule OnlyUntilFirstSuccess="0" FailIfNoSuccessInSched="0" RunEvenIfNotif="1">
            <Days>
                <DayOfWeek>Monday</DayOfWeek>
                <DayOfWeek>Tuesday</DayOfWeek>
                <DayOfWeek>Wednesday</DayOfWeek>
                <DayOfWeek>Thursday</DayOfWeek>
                <DayOfWeek>Friday</DayOfWeek>
                <DayOfWeek>Saturday</DayOfWeek>
                <DayOfWeek>Sunday</DayOfWeek>
            </Days>
        </Schedule>
    </Schedules>
</Task>
4

2 に答える 2

1

PowerShell で動作させるには、XML スニピットに行を追加する必要がありました。

<xml>
...
</xml>

私はPowerShell v 3.0を使用していましたが、これを機能させました。

$config = [xml](get-content 'dat.xml')

foreach($task in $config.xml.Task){

    $props = @{
        'taskID'=$task.ID
        'Sunday'=$NULL
        'Monday'=$NULL
        'Tuesday'=$NULL
        'Wednesday'=$NULL
        'Thursday'=$NULL
        'Friday'=$NULL
        'Saturday'=$NULL
    }

    foreach($DoW in $task.Schedules.Schedule.Days.DayOfWeek){
        foreach($day in $DoW){
            #POWERSHELL!!!
            $props.$day = $true #Or equals 1 whatever  
        }   
    }

    $newCSV += @(New-Object -TypeName psobject -Property $props)
}
$newCSV

これは私が得た出力です。

Thursday  : True
Sunday    :
taskID    : 1
Saturday  : True
Friday    : True
Tuesday   :
Monday    : True
Wednesday :

Thursday  :
Sunday    :
taskID    : 2
Saturday  :
Friday    : True
Tuesday   :
Monday    : True
Wednesday :

Thursday  : True
Sunday    : True
taskID    : 3
Saturday  : True
Friday    : True
Tuesday   : True
Monday    : True
Wednesday : True

PowerShell は奇妙に出力しますが、すべて整理されています。いつでも format table を使用できます$newCSV | Format-Table TaskID,Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday -AutoSize。Export-CSV は、すべての列を正しく保持します。

アップデート

いつでもswitchステートメントを使用してプロパティを編集できます。次のような優れたswitch$props.$day = $trueステートメントに置き換えます。

foreach($DoW in $task.Schedules.Schedule.Days.DayOfWeek){
    foreach($day in $DoW){
        #$props.$day = $true
        switch ($day){
            'Sunday'{$props.Sunday = $true}
            'Monday'{$props.Monday = $true}
            'Tuesday'{$props.Tuesday = $true}
            'Wednesday'{$props.Wednesday = $true}
            'Thursday'{$props.Thursday = $true}
            'Friday'{$props.Friday = $true}
            'Saturday'{$props.Saturday = $true}
            default{"$day is not a Day of the Week"}
        }
    }
}
于 2013-04-02T16:34:02.570 に答える