使用powershell读取zip文件

问题描述 投票:0回答:1

有没有更快的方法来过滤 zip 文件?我的代码逐行读取文件,因此数据加载速度非常慢。我可以一次过滤多行吗?

$ZipPath = 'C:\Test\TestZip.zip'
Add-Type -assembly "system.io.compression.filesystem"
$zip = [io.compression.zipfile]::OpenRead($ZipPath)
$file = $zip.Entries[0]
$stream = $file.Open()
$reader = New-Object IO.StreamReader($stream)
$eachlinenumber = 1
while (($readeachline = $reader.ReadLine()) -ne $null)
{
    
    $x = select-string -pattern "Order1" -InputObject $readeachline 
    Add-Content C:\text\TestFile.txt $x
}  

$reader.Close()
$stream.Close()
$zip.Dispose()
powershell zip system.io.compression c#-ziparchive
1个回答
2
投票

代码的问题不是因为您正在逐行读取内容,实际问题是由于在每次循环迭代时附加到文件造成的。我假设您希望将邮政编码条目中与

Order1
匹配的所有行添加到
TestFile.txt
,在这种情况下,您应该考虑将
StreamWriter
StreamReader
结合使用。这将使文件流在迭代每一行时保持打开状态。

try {
    Add-Type -AssemblyName System.IO.Compression.Filesystem

    $zipPath = 'C:\Test\TestZip.zip'
    $zipFile = [IO.Compression.ZipFile]::OpenRead($ZipPath)
    $zipEntry = $zipFile.Entries[0]
    $entryStream = $zipEntry.Open()
    $reader = [IO.StreamReader]::new($entryStream)
    $writer = [IO.StreamWriter]::new('C:\text\TestFile.txt')

    while (-not $reader.EndOfStream) {
        if(($line = $reader.ReadLine()) -match 'Order1') {
            $writer.WriteLine($line)
        }
    }
}
finally {
    $reader, $writer, $entryStream, $zipFile | ForEach-Object Dispose
}

如果您希望简化上面演示的过程,读取 zip 存档并替换 zip 存档条目的内容,您可能会发现使用 PS压缩模块 会更容易(免责声明:我是作者)该模块的)。

这就是使用该模块的代码的样子:

Get-ZipEntry 'C:\Test\TestZip.zip' -EntryType Archive |
    Select-Object -First 1 |
    Get-ZipEntryContent |
    Where-Object { $_ -match 'Order1' } |
    Set-Content 'C:\text\TestFile.txt'
© www.soinside.com 2019 - 2024. All rights reserved.