在 Powershell 中,处理超过 1GB 的文件时收到“OutOfMemoryException”

Sus*_*ton 5 powershell file-get-contents

我在加载到数据仓库之前进行了一些文件清理,并遇到了文件大小调整问题:

(Get-Content -path C:\Workspace\workfile\myfile.txt -Raw) -replace '\\"', '"' | Set-Content C:\Workspace\workfile\myfileCLEAN.txt
Run Code Online (Sandbox Code Playgroud)

我的文件大约有2GB。我收到以下错误,但不知道如何纠正。

Get-Content:抛出“System.OutOfMemoryException”类型的异常,........

我不是编码员,但我确实喜欢学习,所以正在构建自己的数据仓库。因此,如果您确实做出回应,请记住我的经验水平:)

mkl*_*nt0 2

  • 逐行读取文本文件(无需将整个文件加载到内存中)的一种高效方法switch是使用带有参数的语句-File

  • 编写文本文件的一种高效方法是使用实System.IO.StreamWriter​​例。

  • 正如马蒂亚斯在他的回答中指出的那样,由于正则表达式的转义规则,逐字地使用\"基于正则表达式的运算符实际上替换了alone 。虽然您可以使用 来解决这个问题,但在这种情况下,更简单且性能更好的替代方法是使用类型的方法,该方法对文字子字符串进行操作。-replace" '\\"'[string]Replace()

把它们放在一起:

# Note: Be sure to use a *full* path, because .NET's working dir. usually
#       differs from PowerShell's.
$streamWriter = [System.IO.StreamWriter]::new('C:\Workspace\workfile\myfileCLEAN.txt')

switch -File C:\Workspace\workfile\myfile.txt {
  default { $streamWriter.WriteLine($_.Replace('\"', '"')) }
}

$streamWriter.Close()
Run Code Online (Sandbox Code Playgroud)

注意:如果您使用版本的 Windows PowerShell(即版本 4 或更低版本),请
New-Object System.IO.StreamWriter 'C:\Workspace\workfile\myfileCLEAN.txt'
使用
[System.IO.StreamWriter]::new('C:\Workspace\workfile\myfileCLEAN.txt')