2015-10-12 43 views
1

我有下列變量然後設置內容:PowerShell的:的ConvertTo-CSV和通過對象過濾器

$input = "H:\input_file.txt" 
$output = "H:\output_file.txt" 
$data = Get-Content -Path $input | ConvertFrom-Csv -Delimiter '|' -Header 'Col1','Col2','Col3','Col4','Col5' 

如上所示,輸入文件具有5列。這個文件有不同的記錄類型。並非所有記錄類型都定義了5列。所以,假設我有3種記錄類型 - A,B和C. A有3列,B有4列,C有5列。一個例子輸入文件的樣子:

A|x|1 
B|y|2|stuff 
C|z|3|stuff|other 
B|y|3|other 
A|z|2 

我的腳本,然後使得一些列的一些修改值(除Col1中)在$數據。我想將$ data中的所有行輸出到文本文件。

如果我這樣做

$data | Select Col1,Col2,Col3,Col4,Col5 | ConvertTo-Csv -Delimiter '|' -NoTypeInformation | % {$_ -replace '"', ""} | Select-Object -Skip 1 | Set-Content -Path $output 

將追加不必要的管道符錄A型和B(因爲他們有小於5列,可是我做Select Col1,Col2,Col3,Col4,Col5)。

有沒有一種乾淨的方式來輸出$數據到一個文本文件沒有不必要的管道字符記錄類型A和B?我現在最好的猜測是對於記錄類型A,B和C有3條獨立的管道,這樣我對給定的記錄類型做了正確的選擇,然後以某種方式將它們粘在一起。

回答

0

這似乎有點棘手,更好地做一些字符串操作,我覺得,

$data|ConvertTo-Csv -NoTypeInformation|ForEach-Object{$_.replace('","','|').replace('"','').replace(',','')}|Select-Object -Skip 1|Set-Content $outputtext 

這裏通過避免_delimiter,我們CANMAKE在PowerShell中使用的一些字符串處理方法

問候, Prasoon Karunan V

1

下面的代碼可能對您有用:

@" 
A|x|1|| 
B|y|2|stuff| 
C|z|3|stuff|other 
B|y|3|other| 
A|z|2|| 
"@ -split '\r\n' | % { $_ -replace '\|+$', '' }