我一直在尝试将一个新列添加到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:...."