根据字符串解析和拆分文件
Parsing and splitting files based on the string
我有一个非常大的文件(因此是 .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
两件事:
您的 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
哈希表。
我有一个非常大的文件(因此是 .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
两件事:
您的 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
哈希表。