将列添加到csv文件中,并根据现有列powershell填充新列



我一直在尝试将一个新列添加到csv文件中,并根据现有列中的值填充新列。

我有一张这样的桌子:

|name  | number | state | desc|
| ---- | ------ |-------|-----|
|a     |  1     |  n    |   i |
|b     |  2     |  n    |   j |
|c     |  3     |  l    |   j |
|d     |  4     |  m    |   k |

我想添加一个新的列数据,并根据与数组匹配的数字列来填充它。

这是我迄今为止的代码:

$a=("a","b","c")
$b=("p","q","r")
.
.
.
$c= import-csv -Path "C:..."
$b |where-object {filtered the file based on some criteria}| select-object number, state, desc, @{Name="data"; Expression={Foreach-object {if ($_.number in $a){$_data = "x"} 
elseif($_.number in $b){$_.data = "y"}.......} | export-csv -notypeinformation -path "C:...."

脚本运行,但不填充新列。请帮助

你的想法是对的。Import-Csv将生成一个对象数组,您可以使用Select-Object添加计算的属性,然后再次管道传输到Export-Csv。然而,从描述或示例代码中并不完全清楚表达式应该是什么;数据";所有物

现在,我将利用我们现有的资源。数组变量$a&$b永远不会匹配任何内容。此外,您不能像那样使用ForEach-Object,分配给$data也不会起作用。表达式脚本块的返回值将指定给命名为数据的特性。以下示例说明了这一点:

$a = ( "1", "2", "3")
$b = ( "4", "5", "6")
Import-Csv -Path "C:temp12-22-20.csv"|
Select-Object number, state, desc,
@{Name = 'Data'; Expression = { If( $_.Number -in $a ){ 'x' } elseif( $_.Number -in $b ){ 'y' } Else { $null }}} |
Export-Csv -Path "C:temp12-22-20_New.csv" -NoTypeInformation

生成的Csv文件将类似于:

number state desc Data
------ ----- ---- ----
1      n     i    x
2      n     j    x
3      l     j    x
4      m     k    y

更新:使用添加成员的示例

您不需要使用循环来添加属性:

$a = ( "1", "2", "3")
$b = ( "4", "5", "6")
Import-Csv -Path "C:temp12-22-20.csv" |
Add-Member -MemberType ScriptProperty -Name "data" -Value { If( $this.Number -in $a ){ 'x' } elseif( $this.Number -in $b ){ 'y' } Else { $null }} -PassThru |
Export-Csv -Path C:temp12-22-20_New.csv -NoTypeInformation

通过使用ScriptProperty的MemberType,我们可以对脚本块进行轻微修改,将$_替换为$this。管道是一个隐式循环。我不确定使用ScriptProperty是否有任何减损,但这会按预期导出。这种方法不需要将输出存储在$c中,但如果愿意,-PassThru将有助于实现这一点。

99%的时间CCD_ 12用于此。我所知道的唯一区别是Select-Object将对象转换为PSCustomObjects。GetMember将保留底层类型,但是Import-Csv最初只输出PSCustomObjects,所以这里没有影响。

尝试迭代导入对象的$c数组,并将新属性添加到所有对象中。您希望确保新列存在于所有对象中。您可以像在示例中那样使用Select-Object,也可以使用Add-Member将其添加到导入的对象中。

$a=("a","b","c")
$b=("p","q","r")
...
$c = Import-Csv -Path "C:..."
$c | ForEach-Object {
$value = ""
# custom logic for value of "data"
# if (...) { $value = ... } 
$_ | Add-Member -MemberType NoteProperty -Name "data" -Value $value
}
$c | Export-Csv -NoTypeInformation -path "C:...."

相关内容

  • 没有找到相关文章

最新更新