比较CSV导入到获取日期的日期

时间:2016-03-24 20:46:20

标签: date csv powershell

我有一个包含许多列的CSV,但我只想导入描述列,部门列和日期列。然后,我想创建一个包含描述,部门和日期信息的新对象,但仅限于具有45天或更早日期的项目。我知道Import-Csv正在引入"项目日期"将列作为字符串,以便我需要使用Get-Date或datetime之类的内容将其设置为日期格式以进行比较。

$data = import-csv .\items.csv | select "Description", "Department", "Item Date"
$CheckDate = (Get-Date).AddDays(-45)
$data2 | Foreach  {get-date $_."Item Date"} |
    select "Description", "Department", "Item Date"
$newdata = $data2 | where {$data."Item Date" -lt $CheckDate}

可能有一种更简单的方法可以做到这一点,或者可能有办法让它发挥作用,但我遇到了麻烦。

2 个答案:

答案 0 :(得分:2)

这里绝对有一些简化空间。

$CheckDate = (Get-Date).AddDays(-45)
$data = Import-Csv .\items.csv | 
    Where-Object {
        ($_."Item Date" -as [DateTime]) -lt $CheckDate
    }

只需投出"项目日期"使用[DateTime]运算符将字符串作为-as,然后将其与$CheckDate调用中的Where-Object进行比较。

答案 1 :(得分:1)

根据CSV中使用的日期格式和计算机的区域设置,只需将字符串转换为DateTime值可能有效,也可能无效。如果您发现它没有使用ParseExact()方法。也许是calculated property,因为您无论如何都要选择列。

$fmt     = 'dd\/mm\/yyyy'
$culture = [Globalization.CultureInfo]::InvariantCulture

$data = Import-Csv .\items.csv |
        Select-Object Description, Department, @{n='Item Date';e={
          [DateTime]::ParseExact($_.'Item Date', $fmt, $culture)
        }} |
        Where-Object { $_.'Item Date' -lt $CheckDate }

请注意,如果您需要匹配文字正斜杠,则必须转义格式字符串中的正斜杠,否则它们将匹配计算机区域设置中配置的任何日期分隔符。