比较 csv 文件中不同格式的日期
Compare dates with different formats in csv file
在如下所示的 csv 文件中比较日期的好方法是什么:
Date1,Date2,Date3
11/10/2016 9:45:00 PM,20161110,11/10/2016
11/15/2016 11:24:00 PM,20160924,11/10/2016
如果找到匹配项,请像这样附加一列...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,Match Found
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
已更新
尝试评论中的代码:
将其与其中 2 列进行比较时...
$csvFile = 'C:\Scripts\Tests\test1.csv'
Import-Csv $csvFile | Select-Object *, @{n='MatchDates';e={
if(([datetime]$_.Date1).Date -eq $_.Date3){
'Match Found'
}Else{
'No Match Found'
}}} |
Export-Csv "$csvFile-results.csv" -NoTypeInformation -Force
输出(正确)...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,Match Found
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
但是,如果我尝试使用以下代码比较所有 3 列
Import-Csv $csvFile | Select-Object *, @{n='MatchDates';e={
if((([datetime]$_.Date1).Date -eq $_.Date3) -and (([datetime]$_.Date2).Date -eq $_.Date3) -and (([datetime]$_.Date1).Date -eq $_.Date2)){
'Match Found'
}Else{
'No Match Found'
}}} |
Export-Csv "$csvFile-results.csv" -NoTypeInformation -Force
输出(不正确)...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
如您所见,第 1 行和最后一列的值是 $null
而不是显示 Match Found
可能是我理解有误?
对于我们在评论中讨论的内容,您走在了正确的轨道上。问题在于那个中间日期。没有一些帮助,它不会转换为 [datetime]。这就是 ParseExact
派上用场的地方。考虑以下因素:
PS D:\temp> [datetime]"20160924"
Cannot convert value "20160924" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
At line:1 char:1
+ [datetime]"20160924"
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider
PS D:\temp> [datetime]::parseexact("20160924","yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)
Saturday, September 24, 2016 12:00:00 AM
请注意,第二个示例返回了正确的日期对象。
你还记得数学里的 transitive property 吗?我们用它来进行简单比较,看看所有日期是否都相同。到目前为止,这不是唯一的方法,但仍然是一个简单的方法。构建您计算的 属性 代码
$csv | Select-Object *,@{Name='MatchDates';Expression={
$date1 = ([datetime]$_.Date1).Date
$date2 = ([datetime]::parseexact($_.Date2,"yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)).Date
$date3 = ([datetime]$_.Date1).Date
if($date1 -eq $date2 -and $date2 -eq $date3){
'Match Found'
} else {
'No Match Found'
}
}
}
通过将转换后的值保存在临时变量中来清除 if
逻辑。
在如下所示的 csv 文件中比较日期的好方法是什么:
Date1,Date2,Date3
11/10/2016 9:45:00 PM,20161110,11/10/2016
11/15/2016 11:24:00 PM,20160924,11/10/2016
如果找到匹配项,请像这样附加一列...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,Match Found
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
已更新
尝试评论中的代码:
将其与其中 2 列进行比较时...
$csvFile = 'C:\Scripts\Tests\test1.csv'
Import-Csv $csvFile | Select-Object *, @{n='MatchDates';e={
if(([datetime]$_.Date1).Date -eq $_.Date3){
'Match Found'
}Else{
'No Match Found'
}}} |
Export-Csv "$csvFile-results.csv" -NoTypeInformation -Force
输出(正确)...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,Match Found
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
但是,如果我尝试使用以下代码比较所有 3 列
Import-Csv $csvFile | Select-Object *, @{n='MatchDates';e={
if((([datetime]$_.Date1).Date -eq $_.Date3) -and (([datetime]$_.Date2).Date -eq $_.Date3) -and (([datetime]$_.Date1).Date -eq $_.Date2)){
'Match Found'
}Else{
'No Match Found'
}}} |
Export-Csv "$csvFile-results.csv" -NoTypeInformation -Force
输出(不正确)...
Date1,Date2,Date3,MatchDates
11/10/2016 9:45:00 PM,20161110,11/10/2016,
11/15/2016 11:24:00 PM,20160924,11/10/2016,No Match Found
如您所见,第 1 行和最后一列的值是 $null
而不是显示 Match Found
可能是我理解有误?
对于我们在评论中讨论的内容,您走在了正确的轨道上。问题在于那个中间日期。没有一些帮助,它不会转换为 [datetime]。这就是 ParseExact
派上用场的地方。考虑以下因素:
PS D:\temp> [datetime]"20160924"
Cannot convert value "20160924" to type "System.DateTime". Error: "String was not recognized as a valid DateTime."
At line:1 char:1
+ [datetime]"20160924"
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [], RuntimeException
+ FullyQualifiedErrorId : InvalidCastParseTargetInvocationWithFormatProvider
PS D:\temp> [datetime]::parseexact("20160924","yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)
Saturday, September 24, 2016 12:00:00 AM
请注意,第二个示例返回了正确的日期对象。
你还记得数学里的 transitive property 吗?我们用它来进行简单比较,看看所有日期是否都相同。到目前为止,这不是唯一的方法,但仍然是一个简单的方法。构建您计算的 属性 代码
$csv | Select-Object *,@{Name='MatchDates';Expression={
$date1 = ([datetime]$_.Date1).Date
$date2 = ([datetime]::parseexact($_.Date2,"yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)).Date
$date3 = ([datetime]$_.Date1).Date
if($date1 -eq $date2 -and $date2 -eq $date3){
'Match Found'
} else {
'No Match Found'
}
}
}
通过将转换后的值保存在临时变量中来清除 if
逻辑。