【问题标题】:Parallel ForEach Workflow Doesn't Export-CSV并行 ForEach 工作流不导出-CSV
【发布时间】:2015-09-27 00:11:42
【问题描述】:

我正在尝试编写一个工作流,该工作流将根据每个附加行评估 CSV 的每一行,以估计哪些行可能是重复的。但是我有 23,000 多行,所以 Powershell 需要 5 天来执行这个脚本。

我把它变成了一个工作流,所以我可以尝试运行一个并行的 foreach 循环,并且不得不修改我分配变量的方式等,以限制工作流。我终于让工作流程正常工作而不会引发错误,但它实际上并没有导出 CSV 文件。

我可以看到powershell.exe 在任务管理器中使用了 20% 的 CPU,我可以进入调试器并查看它是否正常工作。只是没有 CSV。

有什么想法吗?

workflow Leads-Workflow
{
    $leads = Import-CSV C:\Temp\leads.csv
    $Count = $null
    $time = Get-Date
    foreach -Parallel ($lead in $leads)
    {
        for($i=0;$i -le $leads.count;$i++)
        {
            $Poss = 0
            $Dupes = 0
            if($lead.FullName -ne $null -AND $leads[$i].FullName -ne $null -AND $lead.FullName -ne $leads[$i].FullName)
            {
                for($l=0;$l -lt $lead.FullName.Length;$l++)
                {
                    if($lead.FullName[$l] -eq $leads[$i].FullName[$l])
                    {
                    $Poss += $l
                    $l += $lead.FullName.Length
                    }
                }
            }
            elseif($lead.FullName -ne $null -AND $leads[$i].FullName -ne $null -AND $lead.FullName -eq $leads[$i].FullName)
            {
                $Poss += ($lead.FullName.Length*5)
            }
            if($lead.Account -ne $null -AND $leads[$i].Account -ne $null -AND $lead.Account -ne $leads[$i].Account)
            {
                for($l=0;$l -lt $lead.Account.Length;$l++)
                {
                    if($lead.Account[$l] -eq $leads[$i].Account[$l])
                    {
                    $Poss += $l
                    $l += $lead.Account.Length
                    }
                }
            }
            elseif($lead.Account -ne $null -AND $leads[$i].Account -ne $null -AND $lead.Account -eq $leads[$i].Account)
            {
                $Poss += ($lead.Account.Length*5)
            }
            if($lead.Street -ne $null -AND $leads[$i].Street -ne $null -AND $lead.Street -ne $leads[$i].Street)
            {
                for($l=0;$l -lt $lead.Street.Length;$l++)
                {
                    if($lead.Street[$l] -eq $leads[$i].Street[$l])
                    {
                    $Poss += $l
                    $l += $lead.Street.Length
                    }
                }
            }
            elseif($lead.Street -ne $null -AND $leads[$i].Street -ne $null -AND $lead.Street -eq $leads[$i].Street)
            {
                $Poss += ($lead.Street.Length*5)
            }
            if($lead.City -ne $null -AND $leads[$i].City -ne $null -AND $lead.City -ne $leads[$i].City)
            {
                if($lead.City -eq $leads[$i].City)
                {
                    $Poss += 5
                }
            }
            if($lead.Email -ne $null -AND $leads[$i].Email -ne $null -AND $lead.Email -ne $leads[$i].Email)
            {
                for($l=0;$l -lt $lead.Email.Length;$l++)
                {
                    if($lead.Email[$l] -eq $leads[$i].Email[$l])
                    {
                    $Poss += $l
                    $l += $lead.Email.Length
                    }
                }
            }
            elseif($lead.Email -ne $null -AND $leads[$i].Email -ne $null -AND $lead.Email[$l] -eq $leads[$i].Email)
            {
                $Poss += ($lead.Email.Length*5)
            }
            if($lead.Phone -ne $null -AND $leads[$i].Phone -ne $null -AND $lead.Phone -ne $leads[$i].Phone)
            {
                for($l=0;$l -lt $lead.Phone.Length;$l++)
                {
                    if($lead.Phone[$l] -eq $leads[$i].Phone[$l])
                    {
                    $Poss += $l
                    $l += $lead.Phone.Length
                    }
                }
            }
            elseif($lead.Phone -ne $null -AND $leads[$i].Phone -ne $null -AND $lead.Phone -eq $leads[$i].Phone)
            {
                $Poss += ($lead.Phone.Length*5)
            }
            if($lead.Website -ne $null -AND $leads[$i].Website -ne $null -AND $lead.Website -ne $leads[$i].Website)
            {
                for($l=0;$l -lt $lead.Website.Length;$l++)
                {
                    if($lead.Website[$l] -eq $leads[$i].Website[$l])
                    {
                    $Poss += $l
                    $l += $lead.Website.Length
                    }
                }
            }
            elseif($lead.Website -ne $null -AND $leads[$i].Website -ne $null -AND $lead.Website -eq $leads[$i].Website)
            {
                $Poss += ($lead.Website.Length*5)
            }
            if($Poss -ge 100 -AND $lead.LeadID -ne $leads[$i].LeadID)
            {
                $Dupes += $leads[$i].LeadID + "; "
            }
        }
        $lead = $lead | Add-Member @{Poss=$Poss;Dupes=$Dupes} -PassThru
        Export-CSV C:\temp\Deduped\leads.csv -InputObject $lead -Append -Force
        $Workflow:Count += 1
        Write-Progress -Activity "Deduping Leads . . ." -status "Scanned $Count of $($leads.Count)" -percentComplete (($Count / $leads.Count)*100)
    }
}
Leads-Workflow

【问题讨论】:

    标签: csv powershell foreach parallel-processing workflow


    【解决方案1】:

    您希望Export-Csv 如何处理并发写入尝试?

    要从 CSV 中查找或删除重复项,只需使用 Group-Object

    查找重复项:

    $header = 'Account', 'FullName', 'City', 'Street', 'Email', 'Phone', 'Website'
    
    Import-Csv 'C:\Temp\leads.csv' |
      Group-Object $header |
      ? { $_.Group.Count -gt 1 }
    

    删除重复项:

    $header = 'Account', 'FullName', 'City', 'Street', 'Email', 'Phone', 'Website'
    
    Import-Csv 'C:\Temp\leads.csv' |
      Group-Object $header |
      ? { $_.Group.Count -eq 1 } |
      select -Expand Group |
      Export-Csv 'C:\Temp\Deduped\leads.csv' -NoType
    

    【讨论】:

    • 我不是在这里简单地删除完全相同的重复项。我正在使用模糊匹配评估重复的可能性。不过,Export-CSV 无法处理并发写入尝试是有道理的。谢谢你。如果我构建一个数组,然后在脚本末尾将数组写入 CSV,我应该期望它能够工作?
    • 看起来也不行。我想知道它是否与 for $i 循环由于多个线程中发生的增加或 $count 变量在多个线程中增加等而无法并行运行有关。当我每隔一分钟左右进入调试器时,即使我将 ThrottleLimit 设置为 4,$i 也会增加 1 或 2,这似乎非常慢。
    猜你喜欢
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-07
    • 2015-06-24
    • 1970-01-01
    • 2015-01-17
    相关资源
    最近更新 更多