2017-09-24 70 views
0

使用PowerShell我试图拆一个文本文件导入使用每一行的开头作为分隔符通过分割线

输入文件的多个文件(transfer.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 

输出文件(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 

这里是我的代码片段:

$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 
} 

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

+2

您从不将输出文件更改为除“Article.txt”之外的任何内容,并且您永远不会告诉它是输出一行还是将其丢弃。您告诉它将输出设置为Article.txt,然后将每行内容添加到内容中。 – TessellatingHeckler

回答

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

正如其他人已经指出的那样,你永远不会改变输出文件到任何来自“不同Article.txt“,并将所有输入行写入定义的输出文件。

如果要根据第一个字段的值将输入文件的行写入不同的文件,建议在该值之后命名输出文件。而且,由于您使用Add-Content来编写输出,为了简单起见,我还建议您通过Get-Content来读取输入文件。性能问题时使用StreamReader(在这种情况下,您也需要使用StreamWriter),但这不仅仅是因为。

Get-Content $InputFile | ForEach-Object { 
    $basename, $null = $_.Split('|', 2) 
    Add-Content (Join-Path $Path "${basename}.txt") $_ 
}