我想请你帮忙。我有一个带有多个 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
答案 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 并写出每个 Date1
和 Date2
之间的工作日,您可以执行以下操作。
正如所评论的,我们需要查看文件中日期的格式并且看起来是 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 等电子表格应用程序中打开后,它将如下所示:
您还可以选择使用换行符分隔工作日,方法是将 $workdays -join '; '
更改为 $workdays -join "`r`n"
。
一旦加载到 Excel 中,您需要将 Cell 属性设置为“Wrap text”。 然后文件将看起来像这样: