有没有办法提高此脚本的文件写入速度

时间:2017-05-23 14:52:14

标签: powershell

有没有办法加快和优化这个.ps1脚本。它以大约1KB / s的速度写入文件,如果文件大于几MB,它会慢一些。

此脚本逐行读取并逐渐增加\< x但每个行号都重置。

这是我的第一个剧本,所以这就是为什么它如此野蛮。

$reader = [System.IO.File]::OpenText("file")
try {
for() {
    $line = $reader.ReadLine()
    if ($line -eq $null) { break }

    $numbers =  [System.Text.RegularExpressions.Regex]::Matches($line, "\<x")

    for ($i = $numbers.Count - 1; $i -ge 0; $i--)
    {

        Write-Host ($numbers[$i].Index + $numbers[$i].Length)
        $line = $line.Substring(0, $numbers[$i].Index) +  "\<x" + ($i + 1).ToString() +  $line.Substring($numbers[$i].Index + $numbers[$i].Length)
    } 

    $line | Out-File "outfile" -Append
}   
}
finally {
$reader.Close() 
} 

2 个答案:

答案 0 :(得分:1)

文件有多大?最好将它完全加载到RAM中。

$lines = [System.IO.File]::ReadAllLines("file")
for ($i = 0; $i -lt $lines.Count; $i++) { 
    $numbers = [System.Text.RegularExpressions.Regex]::Matches($lines[$i], "\<x")
    for ($n = $numbers.Count - 1; $n -ge 0; $n--) {
        Write-Host ($numbers[$n].Index + $numbers[$n].Length)
        $lines[$i] = $lines[$i].Substring(0, $numbers[$n].Index) +  "\<x" + ($n + 1).ToString() +  $lines[$i].Substring($numbers[$n].Index + $numbers[$n].Length)
    }
}
[System.IO.File]::WriteAllLines("outfile", $lines)

答案 1 :(得分:0)

您不必每次都Out-File重新打开并写入文件,而是使用StreamWriter

$reader = [System.IO.File]::OpenText("file")

# Create writer to output file
$writer = [System.IO.File]::CreateText("outfile")
try {
    while(-not $reader.EndOfStream) {
        $line = $reader.ReadLine()

        $numbers =  [System.Text.RegularExpressions.Regex]::Matches($line, "\<x")

        for ($i = $numbers.Count - 1; $i -ge 0; $i--)
        {
            Write-Host ($numbers[$i].Index + $numbers[$i].Length)
            $line = $line.Substring(0, $numbers[$i].Index) +  "\<x" + ($i + 1).ToString() +  $line.Substring($numbers[$i].Index + $numbers[$i].Length)
        } 

        # Write line to output file
        $writer.WriteLine($line)
    }
}
catch{}
finally {
    $reader.Close() 
    $writer.Close()
}