Powershell 使用 StreamWriter 写入数组
Powershell write array using 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)。
我错过了什么?提前谢谢你。
如果你真的想使用数组试试这个:
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()
}
}
您不需要执行所有收集操作。
$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' {$_}
}
))
我是 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)。
我错过了什么?提前谢谢你。
如果你真的想使用数组试试这个:
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()
}
}
您不需要执行所有收集操作。
$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' {$_}
}
))