2013-08-02 82 views
1

希望有人可以提供一個建議來幫助我加速Powershell腳本。我正在做的是讀取數百個CSV文件,解析信息以獲取有關缺少條目的數據,然後將該輸出寫入HTML文件。這裏是循環,我使用處理的文件:解析多個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 
    } 
} 

這個循環工作得很好,當我與幾個CSV文件測試,但對大量的文件(300+)運行時,它的循環是花費很長時間才能完成每個文件(30s-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分三十秒 閱讀:AB010時間:00.6093750 閱讀:ak007時間:01.7968750 閱讀:ak036時間:02.9218750 閱讀:az052時間: 04.1562500 閱讀:az106時間:05.2187500 閱讀:az141時間:06.4531250 閱讀:az159時間:07.6103516 閱讀:ca01​​7時間:08.8593750 閱讀:ca051時間:10.0468750 閱讀:ca136時間:11.5166015 處理完成。 總時間:59.3300781秒 –

+0

對不起,我的回覆格式不好。每次它讀取一個文件大約需要。 1秒。比以前的文件長。以這種方式對300多個文件進行迭代將花費太長時間才能實用。每個CSV包含約。 50行,所以我不相信每個的大小是一個因素。建議? –

+0

@ W.J.P。查看更新的答案。 –