在Powershell中创建和比较哈希表

在Powershell中创建和比较哈希表,powershell,csv,compare,hashtable,Powershell,Csv,Compare,Hashtable,我正在寻找一个函数来比较两个CSV的格式: a、 csv b、 csv 此csv中的x值将与a.csv中的x值完全相同 我想实现的是,当for循环运行时,输出是b.csv中的键与a.csv的键ve匹配的地方,它将输出b键及其匹配的a值: x2|y2 x3|y3 x4| "no match" 我的CSV的格式可能有也可能没有标题(很可能没有),但值和键列将始终保持不变 我对PixeBar非常陌生,语法和用法类似于其他语言,但似乎总是有一种更简单的方法来运行我认为的PuthS壳中的简单操作。p>

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

a、 csv

b、 csv

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

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

x2|y2 
x3|y3
x4| "no match"
我的CSV的格式可能有也可能没有标题(很可能没有),但值和键列将始终保持不变

我对PixeBar非常陌生,语法和用法类似于其他语言,但似乎总是有一种更简单的方法来运行我认为的PuthS壳中的简单操作。p>


非常感谢您的帮助。

您需要决定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_

来自
a.csv
数据的
x1 | y1
发生了什么变化?//还有,你提到哈希表。。。但是您的数据中没有哈希表。你在说什么哈希表?[grin]我想从a.csv创建一个哈希表。我想比较a和b csv的第一列,并输出a键和b键匹配的值。如果没有从b到a的匹配键,那么我想输出一些说明它的内容。@RandomGuy听起来你已经知道该做什么了!:)问题是什么?如果您的集合相当小,那么在迭代第二个集合时,构建哈希表所需的时间将超过
$CollectionOne-match$itemfromcollectionwo
。所以您的数据集有多大?[咧嘴笑]问题是我对powershell不太精通,所以我不知道从哪里开始…还需要更改我的名字,从random guy开始。谢谢你,李,我要测试一下!这太完美了!非常感谢@欢迎你!很高兴能帮上一点忙。。。[咧嘴笑]
# 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_