2013-08-02 5 views
1

누군가 Powershell 스크립트의 속도를 높이는 데 도움이 될 수 있기를 바랍니다. 내가하고있는 일은 수백 개의 CSV 파일을 읽고 정보를 분석하여 누락 된 항목에 대한 데이터를 얻은 다음 해당 출력을 HTML 파일에 쓰는 것입니다. 여기에 내가 파일을 처리하기 위해 사용하고있는 루프입니다 : 내가 몇 CSV 파일을 테스트 할 때여러 CSV 파일에서 여러 항목 구문 분석

ForEach ($Filename in $FileList) { 
    $CustTemp = import-csv "$FilePath\$Filename" 
    $CustName = $CustTemp[0].CustName 
    Write-Host "Reading data for $CustName"`r 
    For ($counter=0;$counter -lt 31;$counter++){ 
     $CheckDate = (get-date).AddDays(-$counter) 
     $CheckShortDate = $CheckDate.ToShortDateString() 
     $TempData = import-csv "$FilePath\$Filename" | Select FileName,FileDate | where {$_.FileDate -eq $CheckShortDate} 
     If ($TempData -eq $null) { 
      $row = "No file found for $CheckShortDate for $CustName" 
      $HTMLReportItems += $row 
     } 
    $HTMLReportItems = $HTMLReportItems | ConvertTo-Html -Fragment 
    } 
} 

이 루프가 잘 작동하지만 많은 수의 파일 (300 +)에 대해 그것을 실행할 때 루프입니다 각 파일 (30 ~ 1m)을 완료하는 데 오랜 시간이 걸립니다. 이유는 CSV 파일이 반복 당 30 번 액세스되는 이유입니다. 내가 바라는 것은 누군가가 데이터를 어떻게 처리 할 수 ​​있는지에 대해 더 나은 제안을 할 수 있다는 것입니다.

답변

1

당신은 을 여러 번 읽습니다. for 루프 외부에서 읽고 내부 필터링 만 수행하십시오. 루프 외부에서도 HTML 생성을 이동하십시오.

$HTMLReportItems = foreach ($Filename in $FileList) { 
    $csv = Import-Csv (Join-Path $FilePath $Filename) 
    $CustName = $csv[0].CustName 
    $data = $csv | select FileName,FileDate 

    Write-Host "Reading data for $CustName" 

    for ($counter=0;$counter -lt 31;$counter++){ 
    $CheckShortDate = (Get-Date).AddDays(-$counter).ToShortDateString() 
    $TempData = $data | ? {$_.FileDate -eq $CheckShortDate} 
    if ($TempData -eq $null) { 
     "No file found for $CheckShortDate for $CustName" 
    } 
    } 
} 

$HTMLReportItems = $HTMLReportItems | ConvertTo-Html -Fragment 
+0

제안 해 주셔서 감사합니다. 변화를 한 후에도 여전히 이상한 행동을보고 있습니다. 각 반복은 다음 시간보다 오래 걸립니다. 여기에 10 개 CSV 파일로 내 시운전의 출력입니다 : 시작 시간 : 17시 53분 30초 읽기 : ab010 시간 : 00.6093750 읽기 : ak007 시간 : 01.7968750 읽기 : ak036 시간 : 02.9218750 읽기 : az052 시간 : 04.1562500 읽기 : az106 시간 : 05.2187500 읽기 : az141 시간 : 06.4531250 읽기 : az159 시간 : 07.6103516 읽기 : ca017 시간 : 08.8593750 읽기 : ca051 시간 : 10.0468750 읽기 : ca136 시간 : 11.5166015 처리를 완료. 총 시간 : 59.3300781 초. –

+0

내 답변에 형식이 잘못되어 죄송합니다. 파일을 읽을 때마다 약 1 시간이 걸렸습니다. 1 초. 이전 파일보다 오래. 이 방법으로 300 개 이상의 파일을 반복하면 실용적이지 못할 것입니다. 각 CSV에는 대략 50 줄 이니 나는 각각의 크기가 하나의 요소라고 생각하지 않습니다. 제안? –

+0

@ W.J.P. 업데이트 된 답변보기 –