2016-03-24 28 views
1

Birkaç sütun içeren bir CSV var, ancak yalnızca açıklama sütununu, bir bölüm sütununu ve bir tarih sütunu almak istiyorum. Daha sonra açıklama, bölüm ve tarih bilgisiyle yeni bir nesne oluşturmak istiyorum, ancak yalnızca 45 gün veya daha eski bir tarih olan öğeler için. Import-Csv'un "Item Date" sütununu dize olarak getirdiğini biliyorum, böylece Get-Date veya datetime gibi bir şey kullanmalıyım.Karşıdan Yükle CSV Alma To Get-Date

$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} 

Bunu yapmanın kolay bir yolu olabilir veya bu işe ama sorun yaşıyorum almanın bir yolu olabilir.

cevap

2

Burada basitleştirme için kesinlikle bazı oda.

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

Sadece -as operatörü ile bir [DateTime] olarak "Öğe Tarihi" dizesini döküm ve sonra karşılaştırmak senin $CheckDate yılında Where-Object çağrıya.

1

CSV'de ve bilgisayarın bölgesel ayarlarında kullanılan tarih biçimine bağlı olarak, yalnızca dizeyi DateTime değerine çevirmek işe yarayabilir veya çalışmayabilir. Bunun yerine, bunun ParseExact() yöntemini kullanmadığını fark ederseniz. Ve belki de calculated property, yine de sütunları seçiyorsunuz. Eğer eğik değişmez ileri eşlenmesi gerekiyorsa ileri biçim dizesinde eğik

$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 } 

Not aksi takdirde bilgisayarın bölgesel ayarlarında yapılandırılmış olan tarih ayırıcı karakteri maç olacak, öncelenmelidir.