2013-12-13 59 views
1

我想导入一个csv文件,并以管道分隔格式吐出列。Powershell传递字符串ForEach

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

这个伟大的工程,当我明确地传递的列值

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

我想传递的动态生成到的foreach组件变量的字符串。

我能够产生“串”,它看起来完全作为

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

然而,PowerShell是治疗该生成的字符串作为一个单一的柱和第一列仅输出。

例如。

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

任何建议如何获得在foreach部分下传递的列字符串,以便我得到正确的输出?

+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(','))} 

这只是读取行,它分为领域,在每个逗号与竖线加入他们。

继@雷神锤的回答您的评论,在这里是如何在foreach块内使用动态字段名:

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

见我的回答here的说明。

+0

是的,这是计划和@ mjolinor的解决方案也很好。但是,我很想了解如何将字符串作为动态参数传递给foreach或其他任何东西。谢谢 – DataRiver

+0

'$()'告诉PS首先评估括号内的表达式。所以foreach块变成'{$ _。ColumnA +“|” + $ _。ColumnB}' – bouvierr