我有两个比较文件,一个是CSV文件,一个是txt文件。CSV文件拥有大约5,000台服务器的信息,而txt文件只有大约3,000台服务器的名称。CSV中的列是Name、OS和Type。这就是我用来比较物体的方法:
$compareObject = Compare-Object -ReferenceObject $txtFile -DifferenceObject $csvFile.Name -IncludeEqual在此之后,我得到了三个选择。这两个列表中都有==,仅在txt文件=>上的,以及仅在csv文件=<上的。
我想要做的是把.SideIndicator作为相等于==的值,并把它作为一个列放在$csvFile中,这样我就可以最终完成If ($csvFile.SideIndicator -eq "==")...了
所以基本上我想弄清楚怎么写:
If (($csvFile.Name -like $compareObject.InputObject) -and ($compareObject.InputObject -eq "==") {
(add .SideIndicator to CSV file)
}我尝试在脚本中放置一个变量$count++,其中包含add .SideIndicator...,以查看返回了多少个结果,并且它总是返回0。
有人能帮我解决这个问题或给我一些想法吗?
发布于 2018-12-20 15:14:25
您希望使用Compare-Object的结果来结束对SideIndicator的过滤,如下所示:
$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-头
发布于 2018-12-20 16:16:27
这可能太复杂了,但下面是:
假设这是您的CSV文件:
"Name","OS","Type"
"htew804","Windows","WindowsAutherServer"
"wddg9028","Windows","WindowsAutherServer"
"other321","Windows","WindowsBackupServer"这是您的文本文件的内容:
wddg9028
test1234
htew804然后,这个代码:
$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。
发布于 2018-12-20 16:55:18
就像这样简单:
$csvFile = Import-Csv .\sample.csv
$txtFile = Import-csv .\sample.txt -Header Name
Compare-Object -Ref $csvFile -Dif $txtFile -Property Name -IncludeEqual -PassThru要获得所需的输出:
Name OS Type SideIndicator
---- -- ---- -------------
wddg9028 Windows WindowsAutherServer ==
htew804 Windows WindowsAutherServer ==
test1234 =>
other321 Windows WindowsBackupServer <=所以两个人都能从我这里得到一个+1。
https://stackoverflow.com/questions/53871169
复制相似问题