2015-12-22 2 views
0

Что хороший способ сравнить даты в 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 

обновленный

Попытка код, который в комментариях:

при сравнении Тхи s с 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 

выход (isCorrect) ...

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 

выход (isNotCorrect) ...

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 

As вы можете увидеть значение строки 1, а последний столбец - $null вместо того, чтобы показывать Match Found

Возможно, я что-то не понимаю правильно?

+0

В качестве роли [datetime] или использовать [datetime] :: parseexact()? – Matt

+0

Это, конечно, предполагает, что эти даты имеют одинаковый формат. Также вы сравниваете дату в первом столбце, чтобы увидеть, совпадает ли она с датой в последнем столбце? Если они отформатированы так же, вы можете почти просто уйти с базовым '-like' – Matt

+0

' ([datetime] "11/10/2016 9:45:00 PM"). Дата -eq "11/10/2016" ' например. или '([datetime] $ _. Date1) .Date -eq $ _. Date3' – Matt

ответ

1

Вы были на правильном пути с тем, что мы обсуждали в комментариях. Проблема была с этой средней датой. Он не конвертируется в [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 логики, сохранив отлиты значения в temproary переменных.

+0

Yup, сравнение работает хорошо, хотя вы также правы с if (date1 = date3) и (date2 = date3) , тогда нет необходимости проверять (date1 = date3).Однако (и это моя вина за то, что вы не включили его в вопрос), с 2-дневным льготным периодом на каждую дату, возможно, есть missmatch. Вот почему использование 'ParseExact' будет по-прежнему полезно. Еще раз спасибо :) –

+0

@FiddleFreak Итак, вы считали бы матч, если бы даты были не более 2 дней от друг друга? – Matt

Смежные вопросы