我有一个非常大的文件(因此.ReadLines),我需要高效快速地解析并拆分成其他文件。对于包含关键字的每一行,我需要复制该行并附加到特定文件。这是我到目前为止,脚本运行,但文件没有填充。
$filename = "C:\dev\powershell\test1.csv"
foreach ($line in [System.IO.File]::ReadLines($filename)) {
if ($line | %{$_ -match "Apple"}){Out-File -Append Apples.txt}
elseif($line | %{$_ -match "Banana"}){Out-File -Append Bananas.txt}
elseif($line | %{$_ -match "Pear"}){Out-File -Append Pears.txt}
}
csv文件的示例内容:
Apple,Test1,Cross1
Apple,Test2,Cross2
Apple,Test3,Cross3
Banana,Test4,Cross4
Pear,Test5,Cross5
我希望Apples.txt包含:
Apple,Test1,Cross1
Apple,Test2,Cross2
Apple,Test3,Cross3
答案 0 :(得分:2)
一些事情:
您的if
条件不需要%
/ foreach-object
- -match
会自行完成:
foreach ($line in [System.IO.File]::ReadLines($filename)) {
if($line -match "Apple"){
# output to apple.txt
}
else($line -match "Banana"){
# output to banana.txt
}
# etc...
}
由于您实际上没有向Out-File
发送任何输出,因此未填充文件:
foreach ($line in [System.IO.File]::ReadLines($filename)) {
if($line -match "Apple"){
# send $line to the file
$line |Out-File apple.txt -Append
}
# etc...
}
如果您的文件非常大并且您期望有很多匹配的行,我建议您使用StreamWriter
作为输出文件 - 否则Out-File
将始终打开和关闭文件:
$OutFiles = @{
'apple' = New-Object System.IO.StreamWriter $PWD\apples.txt
'banana' = New-Object System.IO.StreamWriter $PWD\bananas.txt
'pear' = New-Object System.IO.StreamWriter $PWD\pears.txt
}
foreach ($line in [System.IO.File]::ReadLines($filename)) {
foreach($keyword in $OutFiles.Keys){
if($line -match $keyword){
$OutFiles[$keyword].WriteLine($line)
continue
}
}
}
foreach($Writer in $OutFiles.Values){
try{
$Writer.Close()
}
finally{
$Writer.Dispose()
}
}
这样,如果需要更新关键字,您也只需维护$OutFiles
哈希表。