【问题标题】:Comparing 2 CSV files with different column names比较具有不同列名的 2 个 CSV 文件
【发布时间】:2015-10-30 12:42:43
【问题描述】:

我有 2 个如下所示的 csv 文件:

文件 1:

IP 地址,设置

文件 2:

端口 IP(与 IP 地址相同,但名称不同),名称

我想要做的是从文件 1 中获取 IP 地址,并将其与文件 2 中的端口 IP 进行比较,然后获取名称。然后我想用以下内容创建第三个文件:

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

【问题讨论】:

  • 如果您想要更准确的结果,您应该提供 CSV 文件的示例。

标签: csv powershell


【解决方案1】:

我会尝试另一种方法:

首先,我将更改 CVS 文件的标题以具有公共列 IP。

其次,我将添加两组对象。

$duplexdata = Import-CSV "C:\queues\duplex.csv"
$qip = Import-CSV "C:\queues\qip.csv"
$duplexdata,$qip | group-object -Property 'IP address'

在结果中,我找到了一个组属性,其中包含允许我构建新对象的所有行。

【讨论】:

    【解决方案2】:

    如果您无法控制输出文件,则可以在使用计算属性导入文件后轻松更改“列”之一。

    $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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-14
      • 2018-06-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多