2015-04-14 2 views
1

У меня есть файлы CSV, у которых много столбцов. Мне нужно преобразовать несколько столбцов, например, некоторые столбцы даты имеют текстовую строку «Отсутствует», и я хочу заменить «Отсутствует» на пустую строку и т. Д.Использование 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 

Edit: Чтобы использовать конвейерную стиль, вы могли бы это сделать например:

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

* является подстановочным знаком, который соответствует всем свойствам. Я не мог найти способ форматировать этот код в лучшую сторону, так что это отвратительно выглядит.

+0

Я думаю, что этот подход может быть не идеальным, поскольку в op упоминается, что может быть много столбцов с датами, которые необходимо решить. Это все равно будет работать. – Matt

+0

@Matt, хотя он просто имел в виду, что он не хотел указывать все неизменные столбцы в коде. –

+0

Будет ли конвейер более эффективным, так как ему может не понадобиться считывать весь файл csv в памяти? Недостатком может быть изменение порядка столбцов (также это не имеет значения в моем случае). – ca9163d9

0

Если все, что вы хотите сделать, это find-replace, вам не нужно читать его как CSV.

Вы могли бы сделать это вместо:

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

Возможно, вы должны изменить свой выходной файл как ваш входной файл, если вы подключили его в том же самом канале, что и у вас. Либо это, либо вы нарушаете трубу и сохраняете входные данные в переменную, которую вы затем выводите на другую строку. – Matt

+0

@Matt - Вы можете уточнить, что вы имеете в виду? –

Смежные вопросы