2015-04-14 77 views
1

我有CSV文件,其中有很多列。我需要轉換幾個列,例如,某些日期列有文本字符串「Missing」,我想將「Missing」替換爲空字符串,等等。使用powershell轉換CSV文件

以下代碼可能工作,但它會很長因爲有很多列。這是寫一個更好的方法嗎?

Import-Csv $file | 
    select @( 
     @{l="xxx"; e={ ....}}, 
     # repeat many times for each column.... 
) | export-Csv 
+0

你的文件沒有標題行嗎? – mjolinor

+0

是的,csv文件有標題。 – ca9163d9

+0

您可以使用命令行查找和替換工具,如'FNR.EXE'在命令行上執行此操作,它可能會更快。 –

回答

2

你可以使用一個命令行式風格,而不是流水線式風格:

$records = Import-Csv $file 

foreach ($record in $records) 
{ 
    if ($record.Date -eq 'Missing') 
    { 
     $record.Date = '' 
    } 
} 

$records | Export-Csv $file 

編輯:要使用流水線式的,你可以做到這一點像這樣:

import-csv $file | 
    select -ExcludeProperty Name1,Name2 -Property *,@{n='Name1'; e={"..."}},@{n='Name2'; e={'...'}} 

The *是一個匹配所有屬性的通配符。我找不到一種更好的方式來格式化代碼,所以它看起來很醜。

+0

我認爲這種方法可能並不理想,因爲操作提到可能會有許多需要解決日期的列。這仍然會工作。 – Matt

+0

@Matt,雖然他只是表示他不想在代碼中指定所有未更改的列。 –

+0

流水線效率會更高,因爲它可能不需要讀取內存中的整個csv文件?缺點是它可能會改變列的順序(在我的情況下也不重要)。 – ca9163d9

0

如果您想要做的只是查找替換,您並不需要將它作爲CSV讀取。

你可以這樣做,而不是:

Get-Content $file | %{$_.ToString().Replace("Missing", "")} | Out-File $file 
+0

當你將它們連接到同一個管道中時,你可能應該將輸出文件更改爲不同的輸入文件。無論是或者你打破了管道,並將輸入數據保存到一個變量,然後你輸出在不同的線路上。 – Matt

+0

@Matt - 你能澄清你的意思嗎? –