首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将比较对象的结果添加到Array

将比较对象的结果添加到Array
EN

Stack Overflow用户
提问于 2018-12-20 15:03:04
回答 3查看 845关注 0票数 0

我有两个比较文件,一个是CSV文件,一个是txt文件。CSV文件拥有大约5,000台服务器的信息,而txt文件只有大约3,000台服务器的名称。CSV中的列是Name、OS和Type。这就是我用来比较物体的方法:

代码语言:javascript
复制
$compareObject = Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual

在此之后,我得到了三个选择。这两个列表中都有==,仅在txt文件=>上的,以及仅在csv文件=<上的。

我想要做的是把.SideIndicator作为相等于==的值,并把它作为一个列放在$csvFile中,这样我就可以最终完成If ($csvFile.SideIndicator -eq "==")...

所以基本上我想弄清楚怎么写:

代码语言:javascript
复制
If (($csvFile.Name -like $compareObject.InputObject) -and ($compareObject.InputObject -eq "==") {
    (add .SideIndicator to CSV file)
}

我尝试在脚本中放置一个变量$count++,其中包含add .SideIndicator...,以查看返回了多少个结果,并且它总是返回0。

有人能帮我解决这个问题或给我一些想法吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-12-20 15:14:25

您希望使用Compare-Object的结果来结束对SideIndicator的过滤,如下所示:

代码语言:javascript
复制
$fields = "name", "street", "zip", "city"
Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual -Property $fields -PassThru | Where-Object {
    $_.SideIndicator -eq "=="
} | Select-Object $fields | Export-Csv ".\output.csv" -NoTypeInformation

其中$fields包含CSV-头

票数 3
EN

Stack Overflow用户

发布于 2018-12-20 16:16:27

这可能太复杂了,但下面是:

假设这是您的CSV文件:

代码语言:javascript
复制
"Name","OS","Type"
"htew804","Windows","WindowsAutherServer"
"wddg9028","Windows","WindowsAutherServer"
"other321","Windows","WindowsBackupServer"

这是您的文本文件的内容:

代码语言:javascript
复制
wddg9028
test1234
htew804

然后,这个代码:

代码语言:javascript
复制
$csvFile = 'D:\blah.csv'
$txtFile = 'D:\names.txt'

# import the .csv file
$csv = Import-Csv -Path $csvFile
# read the .txt file which contains only server names, each on a separate line
$txt = Get-Content -Path $txtFile

$items = Compare-Object -ReferenceObject $txt -DifferenceObject $csv.Name -IncludeEqual -PassThru 
$result = foreach ($item in $items) {
    $name = $item.ToString()
    switch ($item.SideIndicator) {
        '<='  { 
            # the servername is only present in the text file
            [PSCustomObject]@{
                Name = $name
                OS = ''
                Type = ''
                SideIndicator = $item.SideIndicator
                Comment = "Name only found in $txtFile"
            }
            break
        }
        default  { 
            # '==' AND '=>': the servername is only present in the csv file or in both files
            $server = @($csv | Where-Object { $_.Name -eq $name })[0]
            [PSCustomObject]@{
                Name = $server.Name
                OS = $server.OS
                Type = $server.Type
                SideIndicator = $item.SideIndicator
                Comment = if ($item.SideIndicator -eq '==') { "Name found in both files" } else { "Name only found in $csvFile" }
            }
        }
    }
}
$result | Format-Table -AutoSize

产生这一结果:

SideIndicator注释Windows WindowsBackupServer =>名称仅在D:\blah.csv test1234 <=名称中找到,仅在D:\names.txt中找到。

如果希望将此信息写入新的CSV文件,请将Format-Table -AutoSize更改为Export-Csv -Path 'D:\blah_updated.csv' -NoTypeInformation

票数 3
EN

Stack Overflow用户

发布于 2018-12-20 16:55:18

  • 接受Theo的示例文件,但导入两个文件(带有-Header Name的文本文件)
  • 以及Razorfen-PassThru方法,
  • 另外,倒转csv文件作为-Reference的顺序。

就像这样简单:

代码语言:javascript
复制
$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name

Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual -PassThru

要获得所需的输出:

代码语言:javascript
复制
Name     OS      Type                SideIndicator
----     --      ----                -------------
wddg9028 Windows WindowsAutherServer ==
htew804  Windows WindowsAutherServer ==
test1234                             =>
other321 Windows WindowsBackupServer <=

所以两个人都能从我这里得到一个+1。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53871169

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档