PS比较来自csv的多个日期

时间:2021-03-07 19:50:55

标签: powershell

我想请你帮忙。我有一个带有多个 ID 和日期(id、date1、date2)的 csv。我找到了这个脚本。如果我手动输入开始日期和结束日期,它工作正常(参见下面的示例)。我需要在存储在 csv 中的多个日期之间获取工作日。你能帮我吗?

$startdate = Get-Date -Date '2021-03-04'
$enddate = Get-Date -Date '2021-03-08'

$difference = New-TimeSpan -Start $startdate -End $enddate
$difference.Days

$days = [Math]::Ceiling($difference.TotalDays)+1

1..$days | ForEach-Object {
  $startdate
  $startdate = $startdate.AddDays(1)
} |
  Where-Object { $_.DayOfWeek -gt 0 -and $_.DayOfWeek -lt 6}

我将得到的输出 = 3 个工作日:

Thursday, March 4, 2021 12:00:00 AM
Friday, March 5, 2021 12:00:00 AM
Monday, March 8, 2021 12:00:00 AM

样本输入:

Id,Date1,Date2
1,22.2.2021,1.3.2021
2,24.2.2021,5.3.2021
3,2.3.2021,8.3.2021

2 个答案:

答案 0 :(得分:0)

更改 csv 上列名称的 Date1 和 Date2。

$csv=Import-Csv 'your_csv.csv'

foreach($line in $csv)
{
    $startdate = [datetime]$line.Date1
    $enddate = [datetime]$line.Date2

    $difference = New-TimeSpan -Start $startdate -End $enddate

    $days = [Math]::Ceiling($difference.TotalDays)+1

    1..$days | ForEach-Object {
        $startdate
        $startdate = $startdate.AddDays(1)
    } | Where-Object { $_.DayOfWeek -gt 0 -and $_.DayOfWeek -lt 6}
}

答案 1 :(得分:0)

要使用您的 csv 并写出每个 Date1Date2 之间的工作日,您可以执行以下操作。

正如所评论的,我们需要查看文件中日期的格式并且看起来是 d.M.yyyy,因此代码需要首先将其解析为真正的 DateTime 对象:

$data = Import-Csv -Path 'D:\Test\input.csv'
foreach($item in $data) {
    $startdate = [datetime]::ParseExact($item.Date1, 'd.M.yyyy', $null)
    $enddate   = [datetime]::ParseExact($item.Date2, 'd.M.yyyy', $null)
    # subtracting DateTime objects from each other will return a TimeSpan object
    $datediff  = $enddate - $startdate
    $days      = [Math]::Ceiling($datediff.TotalDays) + 1

    Write-Host "`r`nWorking days between $($startdate.ToLongDateString()) and $($enddate.ToLongDateString())" -ForegroundColor Yellow
    1..$days | ForEach-Object {                  # or use: for($i = 0; $i -lt $days; $i++) {..}
        switch ($startdate.DayOfWeek.value__) {
            { 1..5 -contains $_ } {Write-Host $startdate.ToLongDateString() }
        }
        $startdate = $startdate.AddDays(1)
    }
}

使用您的示例 csv 输出

Working days between Monday, February 22, 2021 12:00:00 AM and Monday, March 1, 2021 12:00:00 AM
Monday, February 22, 2021 12:00:00 AM
Tuesday, February 23, 2021 12:00:00 AM
Wednesday, February 24, 2021 12:00:00 AM
Thursday, February 25, 2021 12:00:00 AM
Friday, February 26, 2021 12:00:00 AM
Monday, March 1, 2021 12:00:00 AM

Working days between Wednesday, February 24, 2021 12:00:00 AM and Friday, March 5, 2021 12:00:00 AM
Wednesday, February 24, 2021 12:00:00 AM
Thursday, February 25, 2021 12:00:00 AM
Friday, February 26, 2021 12:00:00 AM
Monday, March 1, 2021 12:00:00 AM
Tuesday, March 2, 2021 12:00:00 AM
Wednesday, March 3, 2021 12:00:00 AM
Thursday, March 4, 2021 12:00:00 AM
Friday, March 5, 2021 12:00:00 AM

Working days between Tuesday, March 2, 2021 12:00:00 AM and Monday, March 8, 2021 12:00:00 AM
Tuesday, March 2, 2021 12:00:00 AM
Wednesday, March 3, 2021 12:00:00 AM
Thursday, March 4, 2021 12:00:00 AM
Friday, March 5, 2021 12:00:00 AM
Monday, March 8, 2021 12:00:00 AM

根据您的评论,输出一个新的 CSV,其中所有工作日都添加到原始输入文件的列中,您将不得不尝试最终如何在 Excel 中显示输出。

$data = Import-Csv -Path 'D:\Test\input.csv'
$newData = foreach($item in $data) {
    $startdate = [datetime]::ParseExact($item.Date1, 'd.M.yyyy', $null)
    $enddate   = [datetime]::ParseExact($item.Date2, 'd.M.yyyy', $null)
    # subtracting DateTime objects from each other will return a TimeSpan object
    $datediff  = $enddate - $startdate
    $days = [Math]::Ceiling($datediff.TotalDays) + 1

    $workdays = 1..$days | ForEach-Object {                  # or use: for($i = 0; $i -lt $days; $i++) {..}
        switch ($startdate.DayOfWeek.value__) {
            # not really needed to show every date with time info, as it will always be '12:00:00 AM'
            { 1..5 -contains $_ } { $startdate.ToString('dddd, MMMM d, yyyy') }
        }
        $startdate = $startdate.AddDays(1)
    }
    # output a new object with all properties from the input csv and added 'Workdays' column
    $item | Select-Object *, @{Name = 'Workdays'; Expression = {$workdays -join '; '}}
}

$newData | Export-Csv -Path 'D:\Test\WorkDays.csv' -NoTypeInformation -UseCulture

这会添加一个“工作日”列,其中所有计算的日期都以分号分隔:

在 Excel 等电子表格应用程序中打开后,它将如下所示:

enter image description here

您还可以选择使用换行符分隔工作日,方法是将 $workdays -join '; ' 更改为 $workdays -join "`r`n"

一旦加载到 Excel 中,您需要将 Cell 属性设置为“Wrap text”。 然后文件将看起来像这样:

enter image description here

相关问题