使用Powershell我试图使用每行的开头作为分隔符将文本文件拆分为多个文件
输入文件(Article.txt
):
3M|9935551876|11.99|2235641|001|1|100|N|780 3M|1135741031|13.99|8735559|003|1|100|N|145 3M|5835551001|20.50|4556481|002|1|100|N|222 3M|4578420001|33.00|1125785|001|1|100|N|652 8L|00811444243|134148|4064080040|1|02/05/2017 21:15:13|8|170502707|19.85 8L|00811444243|130925|4189133003|1|02/05/2017 21:15:13|8|170502707|4.69 8L|00811444243|136513|4186144003|2|02/05/2017 21:15:13|8|170502707|10.83
输出文件($Path = "D:\BATCH\"
$InputFile = (Join-Path $Path "transfer.txt")
$Reader = New-Object System.IO.StreamReader($InputFile)
while (($Line = $Reader.ReadLine()) -ne $null) {
if ($Line.StartsWith("3M")) {
$OutputFile = "Article.txt"
}
Add-Content (Join-Path $Path $OutputFile) $Line
}
):
3M|9935551876|11.99|2235641|001|1|100|N|780 3M|1135741031|13.99|8735559|003|1|100|N|145 3M|5835551001|20.50|4556481|002|1|100|N|222 3M|4578420001|33.00|1125785|001|1|100|N|652
以下是我的代码片段:
{{1}}
结果,创建与输入文件相同的文件。代码有什么问题?
答案 0 :(得分:1)
以下是问题所在。它位于If
循环之外,并将每行的内容添加到输出文件中。但据我了解,这不是你想要的。您只希望将传递If
条件的内容添加到输出文件中。因此,它需要位于If
循环内。
Add-Content (Join-Path $Path $OutputFile) $Line
虽然我不太了解这种方法,因为你会进行尽可能多的磁盘I / O操作,因为有些行传递了if条件。对可扩展性不太好。
您可以将代码更改为此类代码,以将磁盘I / O数量减少到1。
$out = While (($Line = $Reader.ReadLine()) -ne $null) {
If ($Line.StartsWith("3M")) {
$Line
}
}
$OutputFile = "Article.txt"
Add-Content (Join-Path $Path $OutputFile) $Out
答案 1 :(得分:1)
正如其他人已经指出的那样,您永远不会将输出文件更改为与“Article.txt”不同的任何内容,并将所有输入行写入定义的输出文件。
如果要根据第一个字段的值将输入文件的行写入不同的文件,我建议在该值之后命名输出文件。由于您使用Add-Content
编写输出,因此出于简单原因,我还建议您通过Get-Content
读取输入文件。当性能出现问题时使用StreamReader
(在这种情况下,您也希望使用StreamWriter
),但不仅仅是因为。
Get-Content $InputFile | ForEach-Object {
$basename, $null = $_.Split('|', 2)
Add-Content (Join-Path $Path "${basename}.txt") $_
}