我有2个csv文件,如下所示:
文件1:
IP地址,设置
文件2:
端口IP(与具有差异名称的IP地址相同),名称
我想要做的是从文件1获取IP地址并将其与文件2中的端口IP进行比较并获取名称。然后,我想创建一个包含以下内容的第三个文件:
QueName,IP地址,设置
文件1中的IP可以在文件2中有多个IP(一个IP可以属于多个队列)所以当我尝试以下时它会立即给我所有IP地址的列表,我无法连接设置字段到所有行。
$duplexdata = Import-CSV "C:\queues\duplex.csv"
$countduplexdata = (Import-CSV "C:\queues\duplex.csv").count
$qip = Import-CSV "C:\queues\qip.csv"
$countqip = (Import-CSV "C:\queues\duplex.csv").count
$i=0
$j=0
for($i=0; $i -le $countduplexdata+1; $i++)
{
$ipaddress=$duplexdata.'IP address'[$i]
$qip | where{$_.PortIP -eq "$ipaddress"}
得到以下数据:http://imgur.com/T9FQpf3,这很好但是当我尝试连接文件1中的设置字段时,它只会在它找到的每个数据块的末尾添加它。如何将该值添加到每个行?
答案 0 :(得分:0)
我会尝试另一种方法:
首先,我会将CVS文件的标题更改为具有公共列IP。
其次,我会添加两组对象。
$duplexdata = Import-CSV "C:\queues\duplex.csv"
$qip = Import-CSV "C:\queues\qip.csv"
$duplexdata,$qip | group-object -Property 'IP address'
结果中的第三个我找到了一个包含所有行的group属性,允许我构建一个新对象。
答案 1 :(得分:0)
如果您无法控制输出文件,则可以在使用计算属性导入文件后轻松更改其中一个“列”。
$duplexdata = Import-CSV "C:\queues\duplex.csv"
$qip = Import-CSV "C:\queues\qip.csv" | Select @{Label="Ip Address";Expression={$_.PortIP}}
现在,$duplexdata
和$qip
共享列调用“IP地址”,而无需更改源文件。
但在这种情况下,这并不重要。您要求的是SQL JOIN。我建议查看Join-Object的这篇文章。但是你有一个小数据集,所以你可以做这样的事情。
$duplexdata = Import-CSV "C:\temp\file1.csv"
$qip = Import-CSV "C:\temp\file2.csv"
$qip | ForEach-Object{
$address = $_."Port IP"
New-Object -Typename psobject -Property @{
"IP Address" = $address
Setting = $duplexdata | Where-Object{$_."Ip Address" -eq $address} | Select-Object -ExpandProperty Setting
Name = $_.Name
}
} | Select-Object "Ip Address",Name,Setting
为每个$qip
创建一个新对象。对于每个$qip
,我们从其他文件数据中找到匹配的设置。
此外,我看到您导入文件两次。首先是数据,第二是数据。这样做是多余的。
$duplexdata = Import-CSV "C:\queues\duplex.csv"
$countduplexdata = (Import-CSV "C:\queues\duplex.csv").count
可能只是
$duplexdata = Import-CSV "C:\queues\duplex.csv"
$countduplexdata = $duplexdata.count