如何在Windows中比较两个CSV文件

19

我需要在Windows7中比较两个CSV文件。请问如何进行?我想看到这两个文件的不同之处,就像在Linux中使用tkdiff一样。


3
你认真的吗?你试过访问https://www.google.fr/#q=diff+windows 吗? - kebs
3
是的,我尝试了谷歌,但没有找到令人满意的答案,所以我在这里问了一下 :P - XYZ_Linux
你还可以使用Notepad++的比较插件。 - Japheth Ongeri - inkalimeva
比较两个CSV文件实际上相当困难,因为你必须正确转义每个字段,并且你可能希望基于一个键来比较每一行,而不是逐行进行通用文本比较。 - opticyclic
zsv具有快速、开源和跨平台的compare功能(免责声明:我是作者之一):https://github.com/liquidaty/zsv/blob/main/docs/compare.md - mwag
5个回答

26

建议:

  • 按下 Windows+R 快捷键打开Windows运行提示窗口
  • 输入 cmd 并按下 Enter 打开一个命令提示符窗口
  • 通过运行命令 cd C:\path\to\your\directory 更改当前路径以到达两个CSV文件所在位置

提示:要将从剪贴板复制的路径粘贴到命令提示符窗口中,您可以右键单击终端窗口或按下 Shift+Insert

  • 最后,运行 fc filename1.csv filename2.csv > outfile.txt 命令比较两个文件。
    该命令还会将比较结果记录到位于相同文件夹中的文本文件 outfile.txt 中。如果 outfile.txt 不存在,则会自动创建。

5
「fc」是一个可怕的文件比较工具。你可以自己尝试一下:先创建两个完全相同的csv文件并保存好,然后在其中一个文件开头添加一行新内容,看看会发生什么。 - Ken White

8

这里有另一种选项,我认为非常有用,如此处所述

findstr /v /g:"file1.csv" "file2.csv"

其中/v开关返回差异,/g:从file1.csv获取搜索字符串。您可以使用findstr /?获得更多帮助。

您还可以使用以下命令将差异打印到文件中

findstr /v /g:"file1.csv" "file2.csv > diffs.csv"

顺便说一下,与fc相比,我发现findstr更准确,输出更易读。


更新
这对于“较小”的文件非常有效。您可能会在大型文件上遇到out of memory错误。在这种情况下,我不得不转向Python和数据框。友情提示...


3
我今天做了这件事。
假设我们有两个csv文件X和Y,
X有列a,b,c, Y有列a,b,c。
行不是按相同的顺序排列的,并且分散在csv文件中。
我将它们都导入到我的Excel表格中。 我首先按列c排序,然后按列b排序,最后按列a排序。 您可以按任何顺序进行排序。
通过Notepad++的比较插件/Beyond Compare比较排序后的文件。

1

我曾经遇到过这个问题,为了好玩,我尝试编写了一些PowerShell代码来生成“逐列”差异。它运行速度极慢,但更好地解决了我的问题(CSV文件非常宽,因此常规的差异很难解释)。使用Compare-Csv命令并指定需要比较的文件即可。

$ErrorActionPreference = "Stop"

function Compare-Csv
(
    [Parameter(Mandatory)] [string] $ReferenceFile,
    [Parameter(Mandatory)] [string] $DifferenceFile,
    [string[]] $ReferenceIdentifiers = $null,
    [char] $Delimiter = ';'
)
{
    $referenceData = Import-Csv -ErrorAction 'Stop' -Delimiter $Delimiter $ReferenceFile
    $differenceData = Import-Csv -ErrorAction 'Stop' -Delimiter $Delimiter $DifferenceFile
    $referenceDataHeaders = [string[]] ($referenceData | Select-Object -First 1 | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name)
    $differenceDataHeaders = [string[]] ($differenceData | Select-Object -First 1 | Get-Member -MemberType Properties | Select-Object -ExpandProperty Name)
    $supersetHeaders = ($referenceDataHeaders + $differenceDataHeaders) | Select-Object -Unique

    $empty = @()
    $fileDifferences = @()
    $maxLength = ($referenceData.Length, $differenceData.Length | Measure-Object -Maximum).Maximum
    for($i = 0; $i -lt $maxLength; $i++)
    {
        $ref = $empty;
        if($i -lt $referenceData.Length)
        {
            $ref = $referenceData[$i]
        }

        $diff = $empty;
        if($i -lt $differenceData.Length)
        {
            $diff = $differenceData[$i]
        }

        $rowDifferences = $null
        foreach($header in $supersetHeaders)
        {
            $compare = Compare-Object -ReferenceObject $ref -DifferenceObject $diff -Property $header
            if($compare)
            {
                if(-not $rowDifferences)
                {
                    $rowDifferences = @{}
                    if($ReferenceIdentifiers)
                    {
                        $identifer = ($ref | Select-Object -Property $ReferenceIdentifiers).PSObject.Properties.Value
                        $rowDifferences.Add('ReferenceIdentifiers', $identifer)
                    }
                }

                $rowDifferences.Add($header, $compare)
            }
        }

        if($rowDifferences)
        {
            $fileDifferences + $rowDifferences
        }
    }

    return $fileDifferences
}

$differences = Compare-Csv -ReferenceFile 'Ref.csv' -DifferenceFile 'Diff.csv' -ReferenceIdentifiers @('ARRAY OF HEADER NAMES USED TAKEN FROM REFERENCE FILE THAT CAN BE USED TO IDENTIFY THE ROW')
foreach($difference in $differences)
{
    $out = $difference.ReferenceIdentifiers + ": " + ($difference | Select-Object -ExcludeProperty ReferenceIdentifiers | Format-List | Out-String -NoNewline)
    Write-Host ""
    Write-Host $out
}

0

你也可以使用PowerShell完成相同的操作,如果你在只读文件夹中,这可能会很有用。

compare-object -ReferenceObject (Get-Content filename1.CSV) -DifferenceObject (Get-content filename2.CSV)

你可以在文件夹的地址栏中输入powershell,直接启动Powershell,而无需通过cd进行导航。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接