私はCSVファイルで読み込んだPowerShellスクリプトを持っています。特定の列の日付がパラメータの日付よりも大きい場合、その行を新しいファイルに出力します。Where-Object with complex evaluation
今のところ、私はCSVファイルを読んでからForEach-Object
にパイプします。行が "通過する"場合は、それをArraylistに保存します。その後、すべての行が処理されると、Arraylistを出力CSVファイルに出力します。私の開始CSVファイルは225MB以上で、このプロセスは遅いです。
フィルター機能を配管に追加して、通過する行だけが出力CSVに渡されるようにする方法はありますか?現在のWhere-Object
は、-like
,-contains
...のようなものを使用していますが、より複雑な評価形式ではありません。どこにブロックを混乱することを停止するために、私は関数としてConvertToDateを追加しました
Import-Csv -Delimiter "`t" -Header $headerCounter -Path $filePath |
Select-Object -Skip(1) |
ForEach-Object {
#Skip the header
if($lineCounter -eq 1)
{
return
}
$newDate = if ([string]::IsNullOrEmpty($_.1) -eq $true)
{ [DateTime]::MinValue }
else { [datetime]::ParseExact($_.1,”yyyyMMdd”,$null) }
$updateDate = if ([string]::IsNullOrEmpty($_.2) -eq $true)
{ [DateTime]::MinValue }
else { [datetime]::ParseExact($_.2,”yyyyMMdd”,$null) }
$distanceDate = (Get-Date).AddDays($daysBack * -1)
if($newDate -gt $distanceDate -or $updateDate -gt $distanceDate )
{
[void]$filteredArrayList.Add($_)
}
}
...
$filteredArrayList |
ConvertTo-Csv -Delimiter "`t" -NoTypeInformation |
select -Skip 1 |
% { $_ -replace '"', ""} |
out-file $ouputFile -fo -en unicode -Append
どのようにあなたのcsvファイルは次のようになりますか? –