使用 StreamWriter 的 Powershell 写入数组

时间:2021-04-15 17:02:04

标签: powershell streamreader streamwriter

我是 PowerShell 的新手,正在尝试编写一个脚本,让我能够阅读一个非常大的文本文件,并提取以“2020”开头的某些行。

当找到匹配项时,它应该写入一个数组 ($Lines),然后我尝试使用 StreamWriter 将此过滤后的内容输出到另一个文本文件。

这是我目前所拥有的:

$reader = New-Object System.IO.StreamReader 'C:\Users\PSTest\Years.txt'
$writer = New-Object System.IO.StreamWriter 'C:\Users\PSTest\Data.txt'

$lines = @()

        Foreach ($line in $reader) {

             if ($reader -ne $null) {
             while (!$reader.EndOfStream) {
             $line = $reader.ReadLine()

                   if ($line.StartsWith("2020")) { 
                   $lines += $line }

                         $writer.writeline($lines) }      
    }
  }  

 $reader.dispose()
 $writer.dispose()

当我写入控制台时,我可以知道有数百个匹配项,但没有任何内容写入输出文件 (Data.txt)。

我错过了什么?提前致谢。

2 个答案:

答案 0 :(得分:2)

您无需执行所有收集操作。

$reader = New-Object System.IO.StreamReader 'C:\temp\Years.txt'
$writer = New-Object System.IO.StreamWriter 'C:\temp\Data.txt'

while($line = $reader.ReadLine()){
    if($line.StartsWith("2020")){
        $writer.WriteLine($line)
    }
}

$reader.Close()
$reader.Dispose()

$writer.Close()
$writer.Dispose()

我还建议您考虑使用 switch 语句。

Set-Content -Path 'C:\temp\Data.txt' -Value ($(
    switch -Regex -File C:\temp\years.txt {
        '^2020' {$_}
    }
))

答案 1 :(得分:0)

如果你真的想使用数组试试这个:

try
{
$reader = New-Object System.IO.StreamReader 'C:\temp\test.txt'
$lines = @()

while (($line = $reader.ReadLine()) -ne $null)  
{  
if ($line.StartsWith("2020")) { $lines += $line }
}

#not necessary to keep file open
$reader.Close() 

$writer = New-Object System.IO.StreamWriter 'C:\temp\test2.txt'
$lines | %{$writer.WriteLine($_)}

}
finally
{

    if ($reader -ne $null)
    {
        $reader.Close()
        $reader.Dispose()
    }

    if ($writer -ne $null)
    {
        $writer.Close()
        $writer.Dispose()
    }
}

否则:

try
{
$reader = New-Object System.IO.StreamReader 'C:\temp\test.txt'
$writer = New-Object System.IO.StreamWriter 'C:\temp\test2.txt'

while (($line = $reader.ReadLine()) -ne $null)  
{  
if ($line.StartsWith("2020")) { $writer.WriteLine($line)}
}

}
finally
{

    if ($reader -ne $null)
    {
        $reader.Close()
        $reader.Dispose()
    }

    if ($writer -ne $null)
    {
        $writer.Close()
        $writer.Dispose()
    }
}
相关问题