按行拆分文本文件

时间:2017-09-24 23:09:17

标签: windows powershell text

使用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}}

结果,创建与输入文件相同的文件。代码有什么问题?

2 个答案:

答案 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") $_
}