我是 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)。
我错过了什么?提前致谢。
答案 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()
}
}