【发布时间】:2017-05-29 14:01:34
【问题描述】:
我有一个大型 CSV 文件,其中一些字段嵌入了新行。 Excel 2016 在导入包含嵌入新行的字段的行的 CSV 时会产生错误。
基于this post,我编写了代码以用空格替换任何字段中的任何新行。下面是一个复制功能和问题的代码块。选项 1 有效。被注释掉的选项 2 将我的对象转换为字符串。我希望选项 2 可以运行得更快。
问题:有没有更好的方法来优化处理超大文件的性能?
$array = @([PSCustomObject]@{"ID"="1"; "Name"="Joe`nSmith"},
[PSCustomObject]@{"ID"="2"; "Name"="Jasmine Baker"})
$array = $array | ForEach-Object {
#Option 1: produces an Object, but is code optimized?
foreach ($n in $_.PSObject.Properties.Name) {
$_.PSObject.Properties[$n].Value = `
$_.PSObject.Properties[$n].Value -replace "`n"," "
}
#Option 2: produces a string, not an object
#$_ = $_ -replace "`n"," "
$_
}
请记住,在我的实际用例中,每一行都有 > 15 个字段,并且它们的任意组合都可能嵌入一个或多个新行。
【问题讨论】:
-
我在某处读到 ForEach 比 ForEach-Object 快。您可以对您在秒表类中提到的两种情况进行一些测试。像这样使用它: $resultstime = new-timespan -Minutes 1 $resultstime = [diagnostics.stopwatch]::StartNew() $resultstime.Elapsed 记得停止它:)
-
谢谢马丁。我将使用秒表类并将我的原始代码与@wOxxOm 的建议进行比较。
-
请分享你的发现:)
-
使用我大约 16.5 MB 和 25,000 行的数据集,ForEach-Object 循环在 36 秒内运行。 foreach 循环在 11 中运行。
标签: powershell replace newline