2017-05-29 13 views
0

我有一個很大的CSV文件,其中一些字段有一個新行嵌入。導入帶有嵌入了新行的字段的行的CSV時,Excel 2016會產生錯誤。這是替換PowerShell中所有對象屬性中文本的最佳方式嗎?

基於this post,我編寫了代碼以用空格替換任何字段中的任何新行。以下是重複功能和問題的代碼塊。選項1有效。選項2被註釋掉,將我的對象轉換爲一個字符串。我希望選項2運行得更快。

問:是否有更好的方法來優化處理非常大的文件的性能?請記住,在我的真實世界的用例中,每行有> 15個字段,並且它們的任意組合可能會嵌入一條或多條新行。

+0

我聽說的ForEach比的foreach對象更快更快。 您可以對秒錶類提及的兩種場景進行一些測試。利用它,像這樣: $ resultstime =新入庫時間-Minutes 1 $ resultstime = [diagnostics.stopwatch] :: StartNew() $ resultstime.Elapsed 記住停止它:) –

+0

感謝馬丁。我將使用秒錶類和時間我的原始代碼與@wOxxOm的建議進行比較。 –

+0

請分享您的發現:) –

回答

0
  • 使用快速TextFieldParser閱讀,處理,並從文件(PowerShell的3+)建立CSV:

    [Reflection.Assembly]::LoadWithPartialName('Microsoft.VisualBasic') >$null 
    $parser = New-Object Microsoft.VisualBasic.FileIO.TextFieldParser 'r:\1.csv' 
    $parser.SetDelimiters(',') 
    $header = $parser.ReadFields() 
    
    $CSV = while (!$parser.EndOfData) { 
        $i = 0 
        $row = [ordered]@{} 
        foreach ($field in $parser.ReadFields()) { 
         $row[$header[$i++]] = $field.replace("`n", ' ') 
        } 
        [PSCustomObject]$row 
    } 
    
  • 或修改每個字段就地在已經存在的CSV數組:

    foreach ($row in $CSV) { 
        foreach ($field in $row.PSObject.Properties) { 
         $field.value = $field.value.replace("`n", ' ') 
        } 
    } 
    

注:

  1. foreach聲明比管道到ForEach-Object(也別名爲foreach
  2. $stringVariable.replace()更快然後-replace操作
+0

感謝您的詳細回覆。我會嘗試這兩種方法,看看哪個更快。 –

+0

foreach肯定比Foreach-Object快。替換循環在ForEach-Object上需要36秒,而在foreach循環中只需要11秒。 –

+0

我也放棄嘗試使用 - 替換對象。它似乎只將結果轉換爲一個字符串。對於每週兩次的腳本,11秒是足夠快的。 –

相關問題