我有一个PowerShell脚本,我在CSV文件中读取,如果某列中的日期大于参数日期,我将该行输出到新文件。
截至目前,我读取了CSV文件,然后输送到We don't need seperate settings.gradle for each subprojects.
,如果行“通过”,我将其存储在Arraylist中。然后,当处理完所有行时,我将Arraylist输出到输出CSV文件。我的起始CSV文件是225MB,超过25万行,这意味着这个过程很慢。
有没有办法可以在我的管道中添加过滤功能,以便只将传递的行一次性传递给输出CSV?目前ForEach-Object
只使用Where-Object
,-like
等内容,而不是更复杂的评估形式。
对于最佳做法,我的代码如下:
-contains
答案 0 :(得分:2)
我已经将ConvertToDate添加为一个函数来阻止混淆Where块。
DistanceDate已用完,因为它似乎只计算一次。
ExportCsv是一个将管道输入写入文件的小功能。
我没有测试过,所以除非我很幸运,否则很可能会出现错误。
function ConvertToDate {
param(
[String]$DateString
)
if ($DateString -eq '') {
return [DateTime]::MinValue
} else {
return [DateTime]::ParseExact($DateString, ”yyyyMMdd”, $null)
}
}
filter ExportCsv {
param(
[Parameter(Position = 1)]
[String]$Path
)
$csv = $_ | ConvertTo-Csv -Delimiter "`t" | Select-Object -Last 1
$csv -replace '"' | Out-File $Path -Append -Encoding Unicode -Force
}
$distanceDate = (Get-Date).AddDays($daysBack * -1)
Import-Csv -Delimiter "`t" -Header $headerCounter -Path $filePath |
Select-Object -Skip 1 |
Where-Object { (ConvertToDate $_.1) -gt $distanceDate -or (ConvertToDate $_.2) -gt $distanceDate } |
ExportCsv $OutputFile
答案 1 :(得分:0)
当然,只需添加一个从管道获取值并将Import-Csv的结果传递给它的函数。在该功能中,您可以检查是否要过滤当前项目。这是一个简单的示例,它使用字符串列表并过滤以h
开头的所有字符串:
$x = @('hello', 'world', 'hello', 'tree')
filter Filter-CsvByMyRequirements
{
Param(
[Parameter(Mandatory=$true,
ValueFromPipeline=$true)]
$InputObject
)
Process
{
if ($_ -match '^h.*')
{
$_
}
}
}
$x | Filter-CsvByMyRequirements | Write-Host
<强>输出:强>
hello
hello