2016-03-24 30 views
1

複数の列を含むCSVがありますが、説明列、部門列、および日付列のみをインポートします。私は、説明、部署、および日付情報を持つ新しいオブジェクトを作成したいが、45日以上の日付のアイテムについてのみ作成したい。私はImport-Csvが文字列として "Item Date"列を持ち込んでいるので、比較のために日付形式にするにはGet-Dateやdatetimeのようなものを使う必要があることを知っています。CSVからインポートする日付を取得する日付を取得する

$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

間違いなくここに簡略化のためのスペースがあります。

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

ただ-asオペレータと[DateTime]として「アイテムの日付」の文字列をキャストしてWhere-Objectコールであなたの$CheckDateにそれを比較します。

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 } 

注意はそうでない場合は、コンピュータの地域設定で設定されているものは何でも日付区切り文字にマッチします、エスケープする必要があります。

関連する問題