【问题标题】:Creating and Comparing Hash Tables in Powershell在 Powershell 中创建和比较哈希表
【发布时间】:2019-10-03 16:39:57
【问题描述】:

我正在寻找一个函数来比较两个格式如下的 CSV:

a.csv

x1|y1
x2|y2
x3|y3

b.csv

x2
x3
x4

此 csv 中的 x 值将与 a.csv 中的 x 值完全相同

我想要实现的是当 for 循环运行时,输出是 b.csv 中的键与 a.csv 的键 ve 匹配的任何位置,它将输出 b 键及其匹配的值:

x2|y2 
x3|y3
x4| "no match"

我的 CSV 格式可能是也可能不是标题(很可能不是),但值和键列将始终保持不变。

我对 PowerShell 非常陌生,语法和用法与其他语言相似,但似乎总有一种更简单的方法可以在 PowerShell 中运行我认为的简单操作。

任何帮助将不胜感激。

【问题讨论】:

  • a.csv 数据中的x1|y1 发生了什么变化? ///// 另外,您提到了哈希表...但是您的数据中没有哈希表。你在说什么哈希表? [咧嘴]
  • 我想从 a.csv 创建一个哈希表我想比较 a 和 b csv 的第一列并输出 a 键和 b 键匹配的值。如果没有从 b 到 a 的匹配键,那么我想输出一些说明它的内容。
  • @RandomGuy 听起来您已经确切知道该做什么了! :) 问题是什么?
  • 如果您的集合相当小,那么在遍历第二个集合时构建哈希表将比$CollectionOne -match $ItemFromCollectioTwo 花费更长的时间。所以......你的数据集有多大? [咧嘴]
  • 问题是我不精通powershell,所以我不知道从哪里开始......还需要在这里从随机人那里更改我的名字哈哈

标签: powershell csv compare hashtable


【解决方案1】:

您需要确定 CSV 文件中是否包含标题。有办法处理“有时”,但这是一个不同的问题,应该从源头上解决。 [咧嘴一笑]

这将检查第二个文件中的每个项目与第一个文件中的所有项目。如果找到匹配项,则使用第一个文件中的值。如果不匹配,则使用第二个文件中的值,并且第二列填充“未找到”文本消息。

# fake reading in a CSV file
#    in real life, use Import-CSV
$OneInStuff = @'
x1, y1
x2, y2
x3, y3
'@ | ConvertFrom-Csv -Header 'OneX', 'OneY'

# fake reading in a 2nd CSV file
$TwoInStuff = @'
x2
x3
x4
'@ | ConvertFrom-Csv -Header 'Twox'

$NotInTwo = '_Not In Two_'

$ThreeStuff = foreach ($TIS_Item in $TwoInStuff)
    {
    $X_InBoth = $OneInStuff -match $TIS_Item.Twox
    if ($X_InBoth)
        {
        [PSCustomObject]@{
            ThreeX = $X_InBoth.OneX
            ThreeY = $X_InBoth.OneY
            }
        }
        else
        {
        [PSCustomObject]@{
            ThreeX = $TIS_Item.Twox
            ThreeY = $NotInTwo
            }
        }
    }

$ThreeStuff

输出...

ThreeX ThreeY      
------ ------      
x2     y2          
x3     y3          
x4     _Not In Two_

【讨论】:

  • 谢谢李,我要测试一下!
  • 这太完美了!非常感谢!
  • @RandomGuy - 不客气!很高兴能帮上一点忙……[grin]
猜你喜欢
  • 1970-01-01
  • 2019-01-02
  • 1970-01-01
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-03
  • 2018-01-26
相关资源
最近更新 更多