首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >Powershell中两个Excel文件的比较

Powershell中两个Excel文件的比较
EN

Stack Overflow用户
提问于 2019-11-19 22:20:30
回答 2查看 3.6K关注 0票数 1

--我需要帮助比较Powershell中的两个Excel文件。

我有一个Excel文件,其中包含6 000行和4-5列以及标题:

“号码”“名称”“移动数据”。

让我们称之为:$Services

现在,我想将该文件与其他Excel文件进行比较。例如:

一个文件,包含50行头列:"Number“、"Name”等。

我们叫它$Department吧

重要的是,在$Services中,它包含更重要的列,如“移动数据”,

因此,我的任务是比较列:“数字”从$Services和列“数字”从彼此的Excel文件。

如果它们匹配,则从$Services中写入“整行”

我不太熟悉Excel,所以我想,在Powershell中应该可以这样做。

我是Powershell的新手,所以我只知道一些基本的东西。我对定制对象和param不太熟悉。

无论如何,我试图做的是首先用ImportExcel在变量中声明它们:

代码语言:javascript
运行
复制
$Services = Import-Excel -Path 'C:\Users\*.xlsx'
$Department = Import-Excel -Path 'C:\Users\*.xlsx'

然后我做了个预言:

代码语言:javascript
运行
复制
foreach ($Service in $Services) {
   if (($Service).Number -like ($Department).Number) 
   {Write-Output "$Service"}
}

问题在于,它正在收集( $Services ).Number中的所有空列,并在$Services中写入每一行的输出。

如果nullorEmpty是空的,我尝试向$Department添加一个.Number,但没有产生任何区别。

我还试图添加,如果该行在.Number中为空,则添加"1234",但仍然收集$Services中为空的所有.Number。

我还试着做了:

$Services | ForEach-Object -Process {if (($_).Number -match ($Department).Number) {Write-Output $_}},但它与任何一个都不匹配。当我尝试-notmatch的时候,一切都完成了。

我不知道,但我似乎必须将文件转换为对象,就像将列转换为对象,以便每个字符串都成为一个对象。但现在我的头在旋转,我需要一些提示,我可以从这里开始。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-11-20 04:41:08

我建议从ImportExcel下载模块PSGallery。

导入- Excel可以轻松地将Excel工作表导入到对象行中,特别是如果工作表是“干净的”,即只包含(可选的)标头和数据行。

只需将单元格导入PowerShell对象,并使用比较对象来发现差异。

编辑(在阅读了评论中的海报附加问题后):

要使用特定的属性进行比较,需要将这些属性添加到比较对象参数中。

使用一个简单的"PSCustomObject“来创建一组简单的对象来展示这个想法--它可能如下所示:

代码语言:javascript
运行
复制
$l = 1..4 | ForEach-Object { [pscustomobject]@{a=$_;b=$_+1} }
$r = 1,2,4,5 | ForEach-Object { [pscustomobject]@{a=$_;b=$_+1} }
compare-object $l $r -Property B

B SideIndicator
- -------------
6 =>
4 <=

您还可以这样比较多个属性:

代码语言:javascript
运行
复制
compare-object $l $r -Property A,B

A B SideIndicator 
- - -------------
5 6 =>
3 4 <=

FYI:我发现自己每天输入"Get-Command -Syntax SomeCommand“非常频繁,以至于我只是创建了一个函数"Get-Syntax”(它也扩展了别名),然后将其化名为"syn“。

90%的情况下,一旦您了解了PowerShell cmdlet的结构(至少编写得很好),甚至不需要查看完整的帮助--“语法”块就足够了。

在那之前,每天输入很多次帮助(获取帮助) -- 100+次数。:)

票数 0
EN

Stack Overflow用户

发布于 2019-12-06 19:43:12

因此,我的整个问题的解决方案是添加-PassThru。

因为我的任务是比较两个Excel文件的编号,选择相等的数字,然后从一个文件中获取所有属性。所以我的剧本变成这样:

代码语言:javascript
运行
复制
    $Compare = Compare-Object $Services $Department -Property Numbers -IncludeEqual -ExcludeDifferent -PassThru 
        $Compare | Export-Excel -Path 'C:\Users\*

但是我想知道,-PassThru从ReferenceObject发送所有对象,如何从DifferenceObject发送所有对象?

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

https://stackoverflow.com/questions/58943724

复制
相关文章

相似问题

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