具有复杂评估的Where-Object

时间:2016-08-09 14:03:25

标签: csv powershell pipe

我有一个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

2 个答案:

答案 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