我正在导入一个csv,我想向其中添加一列(结果基于先前的列)
我的数据如下
host address,host prefix,site
10.1.1.0,24,400-01
我想添加一列称为“子网站”
所以我写了这个模块,但是问题是,实际的结束对象是数组而不是字符串
function site {
Param($s)
$s -match '(\d\d\d)'
return $Matches[0]
}
$csv = import-csv $file | select-object *,@{Name='Sub Site';expression= {site $_.site}}
如果我运行命令
PS C:\>$csv[0]
Host Address :10.1.1.0
host prefix :24
site :400-01
sub site : {True,400}
什么时候看起来像
PS C:\>$csv[0]
Host Address :10.1.1.0
host prefix :24
site :400-01
sub site : 400
编辑:我找到了解决方案,但问题现在是为什么。
如果我将功能更改为$s -match "\d\d\d" |out-null
,我会得到预期的400
答案 0 :(得分:2)
很好,您找到了答案。当您找到它时,我正在输入此信息。原因是因为-match
返回一个值,并将其添加到管道中,该管道全部从该函数“返回”。
例如,运行这一行并查看其作用:
"Hello" -match 'h'
它打印True
。
自从我输入了此内容后,这是用解决方法表达您的问题的另一种方式...
function site {
Param($s)
$null = $s -match '(\d\d\d)'
$ret = $Matches[0]
return $ret
}
$csv = @"
host address,host prefix,site
10.1.1.1,24,400-01
10.1.1.2,24,500-02
10.1.1.3,24,600-03
"@
$data = $csv | ConvertFrom-Csv
'1 =============='
$data | ft -AutoSize
$data2 = $data | select-object *,@{Name='Sub Site';expression= {site $_.site}}
'2 =============='
$data2 | ft -AutoSize