无法使用Powershell查找和替换2GB XML文件中的字符串

时间:2018-01-08 00:04:37

标签: xml powershell replace find large-files

我是Windows PowerShell的新手。我试图在4次上执行查找和替换字符串。但即使是简单的查找和替换也会抛出一个

  

类型的异常' System.OutOfMemoryException'被扔了。

错误。我使用了Get-content 有没有办法在不破坏记忆的情况下实现它?

e.g。替换" .000000000Z"用" .732Z"其中732将是作业运行的毫秒数?

PSversion:3.0

2 个答案:

答案 0 :(得分:1)

典型的方法是使用.Net方法逐行完成。

假设你有明智的换行符,你可以这样做:

$FilePath = '...';
$NewFilePath = '...';

$Reader = New-Object -TypeName System.IO.StreamReader -ArgumentList $FilePath;
$Writer = New-Object -TypeName System.IO.StreamWriter -ArgumentList $NewFilePath;

while (($Line = $Reader.ReadLine()) -ne $null) {
    $Writer.WriteLine($Line.Replace('.000000000Z','.732Z'));
}

$Reader.Close();
$Writer.Close();

如果您的XML文件是单行文本,则会变得更复杂。

答案 1 :(得分:1)

Get-Content将整个文件内容加载到RAM中以进行操作。

您需要升级RAM 使用不同的方法,其中有一些。

Get-Content
Get-Content -Raw
Get-Content -ReadCount
Switch -File

.Net阅读器是最理想的

[System.IO.File]::ReadAllText()
[System.IO.File]::ReadAllLines()
[System.IO.File]::ReadLines()
[System.IO.File]::OpenText().readtoend()

System.IO.File.ReadLines()很可能是你最好的选择,因为它返回文件的所有行,但是让你开始迭代直接行,这意味着它不必存储整个内容记忆。 更多详情:https://msdn.microsoft.com/en-us/library/dd383503.aspx

Requires .NET 4.0 or higher.
foreach ($line in [System.IO.File]::ReadLines($filename)) {
    # do something with $line
}

所以,你可以这样做......

$reader = [System.IO.File]::OpenText("my.log")
try {
    for() {
        $line = $reader.ReadLine()
        if ($line -eq $null) { break }
        # process the line
        $line
    }
}
finally {
    $reader.Close()
}

或者缩短它......

$reader = [System.IO.File]::OpenText("my.log")
while($null -ne ($line = $reader.ReadLine())) {
    $line
}