Powershell 使用.NET快速读取/写入大型文件

Powershell 使用.NET快速读取/写入大型文件,powershell,Powershell,我试图搜索大量的大文件并替换部分文本,但我一直遇到错误 我尝试过这个,但有时会在powershell中出现“内存不足”错误 #region The Setup $file = "C:\temp\168MBfile.txt" $hash = @{ ham = 'bacon' toast = 'pancakes' } #endregion The Setup $obj = [System.IO.StreamReader]$file $contents = $obj.ReadToE

我试图搜索大量的大文件并替换部分文本,但我一直遇到错误

我尝试过这个,但有时会在powershell中出现“内存不足”错误

#region The Setup
$file = "C:\temp\168MBfile.txt"

$hash = @{
    ham = 'bacon'
    toast = 'pancakes'
}
#endregion The Setup

$obj = [System.IO.StreamReader]$file
$contents = $obj.ReadToEnd()
$obj.Close()

foreach ($key in $hash.Keys) {
    $contents = $contents -replace [regex]::Escape($key), $hash[$key]
}
try {
    $obj = [System.IO.StreamWriter]$file
    $obj.Write($contents)
} finally {
    if ($obj -ne $null) {
        $obj.Close()
    }
}
然后我尝试了这个(在ISE中),但它崩溃了,并弹出一条消息(对不起,手头没有错误),然后尝试重新启动ISE

$arraylist = New-Object System.Collections.ArrayList
$obj = [System.IO.StreamReader]$file
while (!$obj.EndOfStream) {
    $line = $obj.ReadLine()
    foreach ($key in $hash.Keys) {
        $line = $line -replace [regex]::Escape($key), $hash[$key]
    }
    [void]$arraylist.Add($line)
}
$obj.Close()
$arraylist
最后,我遇到了这样的事情,但我不确定如何正确使用它,我甚至不确定我是否以正确的方式进行

$sourcestream = [System.IO.File]::Open($file)
$newstream = [System.IO.File]::Create($file)
$sourcestream.Stream.CopyTo($newstream)
$sourcestream.Close()

任何建议都将不胜感激。

您可以从读取计数1000开始,并根据您获得的性能进行调整:

get-content textfile -Readcount 1000 | 
    foreach-object {do something} | 
    set-content textfile


您可以从readcount 1000开始,并根据您获得的性能对其进行调整:

get-content textfile -Readcount 1000 | 
    foreach-object {do something} | 
    set-content textfile


好的,那么在我处理完前1000行之后如何获取任何行呢?从帮助文件:
-ReadCount指定一次通过管道发送多少行内容。默认值为1。值0(零)一次发送所有内容。此参数不会更改显示的内容,但会影响显示内容所需的时间。随着ReadCount值的增加,返回第一行所需的时间增加,但操作的总时间减少。这会对非常大的项目产生明显的影响
如果我试图写入读取的同一个文件,您的示例是否有效?不,不会,流也不会。要写入源文件,首先需要将整个文件读取到内存中。但是,当您的done.yup为@FrodeF时,您可以写入临时文件并替换源文件。在仍在读取源代码时写入源代码是不可能的。使用临时文件是一个更安全的选择,因为这样您的源代码就不会被触动。一旦您对结果感到满意,您可以使用
删除项
删除源代码,或者重命名新文件好的,那么,在处理完前1000行之后,我如何获得任何行呢?从帮助文件:
-ReadCount指定一次通过管道发送多少行内容。默认值为1。值0(零)一次发送所有内容。此参数不会更改显示的内容,但会影响显示内容所需的时间。随着ReadCount值的增加,返回第一行所需的时间增加,但操作的总时间减少。这会对非常大的项目产生明显的影响
如果我试图写入读取的同一个文件,您的示例是否有效?不,不会,流也不会。要写入源文件,首先需要将整个文件读取到内存中。但是,当您的done.yup为@FrodeF时,您可以写入临时文件并替换源文件。在仍在读取源代码时写入源代码是不可能的。使用临时文件是一个更安全的选择,因为这样您的源代码就不会被触动。一旦您对结果感到满意,您可以使用
删除项
删除源代码,或者重命名新文件