2015-07-08 6 views
0

Я пытаюсь написать рабочий процесс, который будет оценивать каждую строку CSV для каждой дополнительной строки, чтобы оценить, какие строки могут быть дублированы. Однако у меня есть 23 000 строк, поэтому Powershell займет 5 дней, чтобы выполнить этот скрипт.Параллельный рабочий процесс ForEach не экспортирует-CSV

Я превратил его в рабочий процесс, поэтому я мог попробовать запустить параллельный цикл foreach и должен был изменить способ назначения переменных и т. Д. Для ограничений рабочего потока. Я, наконец, получил рабочий процесс для работы без ошибок, но на самом деле он не экспортирует CSV-файл.

Я могу видеть powershell.exe с использованием 20% -ного процессора в диспетчере задач, и я могу вломиться в отладчик и увидеть, что он работает через линии. Просто нет 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 

ответ

0

Как вы ожидаете, что 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 
+0

Я не просто удаление точные дубликаты здесь. Я оцениваю вероятность дублирования с нечетким сопоставлением. Экспорт-CSV, неспособный обрабатывать одновременные попытки записи, имеет смысл. Спасибо. Я должен ожидать, что это сработает, если я построю массив, а затем напишу массив в CSV в конце скрипта? –

+0

@NoahRoss Возможно. –

+0

Не похоже, что это работает. Мне интересно, связано ли это с тем, что цикл $ i не может запускаться параллельно из-за увеличения, происходящего в нескольких потоках, или переменной счетчика $, увеличивающейся в нескольких потоках и т. Д. Когда я каждую минуту прорываюсь в отладчике, $ i увеличился на 1 или два, даже когда я установил ThrottleLimit в 4, что кажется невероятно медленным. –

Смежные вопросы