2013-12-13 5 views
1

Я пытаюсь импортировать файл csv и выплескивать столбцы в формате с разделителями каналов.Powershell pass string to ForEach

Import-csv file.dat | foreach {($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3')} 

Это прекрасно работает, когда я явно передавая столбец значения

($_.'ColumnX' + "|" $_.'ColumnY') etc. 

Я хочу передать строку переменных сгенерированных динамически компонента Еогеасп.

Я способен генерировать «строка», которая выглядит точно так же, как

"($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3')" 

однако PowerShell обрабатывает, что генерируется строка в виде одного столбца и выводит на первый столбец ONLY.

например.

$columns = ($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3') 
Import-csv file.dat | foreach {$columns} 

Любые рекомендации о том, как получить строку столбца передается в разделе Еогеасп, так что я получаю правильный вывод?

+0

Вы просто пытаетесь преобразовать запятые в трубы? Почему бы не использовать '-replace'? –

ответ

2

Это работает для вас?

Import-csv file.dat | ConvertTo-Csv -Delimiter '|' -NoTypeInformation 
+0

Это замечательно. Это определенно работает! Но, я потратил более 2 дней, пытаясь выяснить, как добавить динамические переменные в группу foreach. Я хотел бы знать, как передать строки как динамические переменные! – DataRiver

+0

Вы имеете в виду, что хотите передать массив имен свойств (заголовки столбцов)? – mjolinor

0

Если я правильно понял, вы хотите прочитать файл CSV (значение, разделенное запятой) и вывести его как вертикальную полосу «|» разделенный файл. Если это так, то вы можете сделать следующее:

gc file.dat | % {[string]::join("|", $_.split(','))} 

Это просто читает строку, разбивает ее на поля в каждой запятой и соединяет их с вертикальными полосами.

После ваш комментарий на ответ @ Mjolnir, вот как использовать динамические имена полей в блоке Еогеасп:

$f1 = "ColumnA" 
$f2 = "ColumnB" 
import-csv file.dat | % {$_.$($f1) + "|" + $_.$($f1)} 

Смотрите мой ответ here для объяснения.

+0

Да, это план и решение @ mjolinor отлично работают. Но я хотел бы понять, как передать строку в качестве динамического параметра для foreach или чего-то еще. Спасибо – DataRiver

+0

'$()' говорит PS, чтобы сначала оценить выражение внутри круглых скобок. Таким образом, блок foreach становится '{$ _. ColumnA +" | " + $ _. ColumnB} ' – bouvierr