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

方法一: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

输出:

 


测试用例二

输入

第一个文件内容为:

复制代码 代码如下:

玉树临风

马上伊利

文章做作

第二个文件内容为:


复制代码 代码如下:

玉树临疯

输出:

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

您可能感兴趣的文章:

声明:本站(华域联盟www.cnhackhy.com)所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。