比较CSV文件中不同格式的日期 [英] Compare dates with different formats in csv file

查看:23
本文介绍了比较CSV文件中不同格式的日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

比较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

已更新

尝试注释中的代码:

将此列与其中两列进行比较时...

$csvFile = 'C:ScriptsTests	est1.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

输出(IsGent)...

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

输出(IsNotGent)...

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:	emp> [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:	emp> [datetime]::parseexact("20160924","yyyyMMdd",[System.Globalization.CultureInfo]::CurrentCulture)

Saturday, September 24, 2016 12:00:00 AM

注意:第二个示例返回了正确的Date对象。


你记得数学中的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文件中不同格式的日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆