2017-09-24 119 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") $_ 
}