比较2个不同列名的CSV文件

时间:2015-10-30 12:42:43

标签: csv powershell

我有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中的设置字段时,它只会在它找到的每个数据块的末尾添加它。如何将该值添加到每个行?

2 个答案:

答案 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
相关问题