PowerShell比较文本文件的两个方法
PowerShell比较文本文件的两个方法
发布时间:2017-01-07 来源:查字典编辑
摘要:需求:比较两个文本文件,不相等时输出行号和列号,和开始不相等的字符。方法一:Compare-Object利用PowerShell命令Comp...

需求:比较两个文本文件,不相等时输出行号和列号,和开始不相等的字符。

方法一:Compare-Object

利用PowerShell命令Compare-Object,非常值得学习。

复制代码 代码如下:

function Compare-Files{

param(

$file1,

$file2,

[switch]$IncludeEqual

)

$content1 = Get-Content $file1

$content2 = Get-Content $file2

$comparedLines = Compare-Object $content1 $content2 -IncludeEqual:$IncludeEqual |

group { $_.InputObject.ReadCount } | sort Name

$comparedLines | foreach {

$curr=$_

switch ($_.Group[0].SideIndicator){

“==” { $right=$left = $curr.Group[0].InputObject;break}

“=>” { $right,$left = $curr.Group[0].InputObject,$curr.Group[1].InputObject;break }

“<=" { $right,$left = $curr.Group[1].InputObject,$curr.Group[0].InputObject;break }

}

[PSCustomObject] @{

Line = $_.Name

Left = $left

Right = $right

}

}

}

方法二,使用流处理比较

解释:没有使用内置的string相等比较,而是定义了函数 Diff-String,可以返回字符串首次不相等时的索引。

复制代码 代码如下:

function Diff-Txt([io.fileinfo]$firstFile,[io.fileinfo]$secondFile)

{

#参数判断

if( -not $firstFile.Exists)

{

throw "$firstFile 不存在"

}

if( -not $secondFile.Exists)

{

throw "$secondFile 不存在"

}

$sr1=[IO.StreamReader]$firstFile.FullName

$sr2=[IO.StreamReader]$secondFile.FullName

#内部函数:比较字符串

#返回-1表示相等,返回其它表示从$str1开始不等的索引

function Diff-String([string]$str1,[string]$str2)

{

for( $i=0; $i -lt $str1.Length; $i++)

{

if($i -lt $str2.Length)

{

if($str1[$i] -cne $str2[$i]){ return $i }

}

else { return $i }

}

if($str2.Length -gt $i ) { return $i }

return -1

}

# firstFile 没到文件末尾

$line=1

while(-not $sr1.EndOfStream)

{

$str1 = $sr1.ReadLine()

# secondFile 到了文件末尾

if($sr2.EndOfStream)

{

Write-Host "=> [$line 行,1 列]"

}

# secondFile 没到文件末尾

else

{

$str2 = $sr2.ReadLine()

$result = Diff-String -str1 $str1 -str2 $str2

if($result -ne -1)

{

Write-Host "<> [$line 行,$result 列] 字符->" -NoNewline

Write-Host $str1[$result] -ForegroundColor red

}

}

$line++

}

# 第二个文件没到文件末尾

while( -not $sr2.EndOfStream)

{

$str2 = $sr2.ReadLine()

Write-Host "<= [$line 行,1 列]"

}

# 关闭文件流

$sr1.Close()

$sr2.Close()

}

测试用例一

输入

第一个文件内容为:

复制代码 代码如下:

PowerShell

中文博客

jb51.net

荔非苔

第二个文件内容为:

复制代码 代码如下:

PowerShell

中文播客

jb51.Net

荔非苔

Mosser Lee

输出:

PowerShell比较文本文件的两个方法1

测试用例二

输入

第一个文件内容为:

复制代码 代码如下:

玉树临风

马上伊利

文章做作

第二个文件内容为:

复制代码 代码如下:

玉树临疯

输出:

PowerShell比较文本文件的两个方法2

文章出处:http://www.pstips.net/

推荐文章
猜你喜欢
附近的人在看
推荐阅读
拓展阅读
相关阅读
网友关注
最新PowerShell学习
热门PowerShell学习
脚本专栏子分类