2016-06-27 19 views
1

我需要使用PowerShell將多個文本文件(跳過標頭)連接成一個大文件。目前我使用這個命令:定義行結束並在連接文件時刪除雙引號

Get-Content *.txt | 
    Select-String -Pattern "^[1-9]" | 
    Select-Object line | 
    Export-Csv mybigfile.txt 

我現在有兩個問題:

  • 如何定義行結束?它會自動使用CRLF,我只需要像源文件中的LF
  • 如何刪除雙引號?它會自動在每行附近添加雙引號,並在源文件中雙引號的列周圍添加雙引號。

實施例:

源輸入:

h1,h2,h3,h4 
3145,"blabla",4568,""LF

電流輸出:

"3145,""blabla"",4568,""""CRLF

希望的輸出:

3145,"blabla",4568,""LF
+0

您能提供兩個樣本記錄,實際輸出和所需輸出嗎? –

回答

1

PowerShell命令使用系統的默認行終止符(CR-LF),所以他們不能做你想做的事。改爲使用StreamWriter

$reader = New-Object IO.StreamReader 'C:\path\to\input.txt' 
$writer = New-Object IO.StreamWriter ('C:\path\to\output.txt', $true) 

# override default line terminator 
$writer.NewLine = "`n" 

# skip first line of input file 
if ($reader.Peek() -ge 0) { 
    $reader.ReadLine() | Out-Null 
} 

while ($reader.Peek() -ge 0) { 
    $writer.WriteLine($reader.ReadLine()) 
} 

$reader.Close(); $reader.Dispose() 
$writer.Close(); $writer.Dispose() 
+0

比我想象的要複雜一點,但它有效。謝謝。 – DoubleT28

0

使用帶參數-FilterGet-ChildItem cmdlet檢索所有文本文件,使用Get-Content加載內容,並使用Select-Object cmdlet和-skip參數跳過第一行。

然後,您有一個字符串數組,您可以通過LF混合在一起,並最終使用Out-File cmdlet的寫入文件:

$output = Get-ChildItem 'your_path_here' -Filter '*.txt' | Foreach { $_ | Get-Content | Select -Skip 1 } 
$output -join "`n" | out-file 'mybigfile.txt' 
+0

感謝馬丁,這幾乎是工作。最後一行仍然以CRLF而不是LF結尾。 – DoubleT28

+0

嗯,也許嘗試'Set-Content' cmdlet而不是'Out-File' –

+0

它們中的任何一個都會將CR-LF附加到輸出。 –