2017-05-29 16 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秒是足够快的。 –

相关问题