我有一个包含许多列的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}
可能有一种更简单的方法可以做到这一点,或者可能有办法让它发挥作用,但我遇到了麻烦。
答案 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 }
请注意,如果您需要匹配文字正斜杠,则必须转义格式字符串中的正斜杠,否则它们将匹配计算机区域设置中配置的任何日期分隔符。