【问题标题】:How to compare two csv files in windows如何在windows中比较两个csv文件
【发布时间】:2021-10-08 04:16:30
【问题描述】:

我需要在 windows7 中比较两个 csv 文件。 我该如何继续实现这一目标。我想看看这两个文件的区别,就像我们可以在 Linux 中使用 tkdiff 一样。

【问题讨论】:

  • 来吧,你是认真的吗?你试过google.fr/#q=diff+windows 吗?
  • 是的,我尝试了谷歌但没有找到任何令人满意的答案,这就是我在这里问的原因:P
  • 你也可以使用notepad++的比较插件。
  • 比较 2 个 csvs 实际上非常困难,因为您必须正确地转义每个字段,而且您可能希望根据键比较每一行,而不是像通用文本比较那样逐行比较。

标签: windows csv excel-2010


【解决方案1】:

建议:

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

提示:要将复制的路径从剪贴板粘贴到 DOS 终端 cmd 窗口,您可以 (1) 右键单击​​终端窗口,或 (2) 按Shift+插入.

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

【讨论】:

  • fc 是一个可怕的文件比较工具。自己尝试一下:创建两个相同的 csv 文件并保存它们,然后在其中一个中添加新的第一行,看看会发生什么。
【解决方案2】:

这是另一个我发现非常有用的选项,如 here 所述:

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

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

您还可以将差异打印到文件,使用:

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

顺便说一句,我发现findstrfc 更准确,输出更易读。


更新
这适用于“较小”的文件。对于较大的文件,您可能会收到 out of memory 错误。在这种情况下,我不得不求助于 Python 和数据框。只是一个友好的提醒......

【讨论】:

    【解决方案3】:

    我今天做了这个。

    假设我们有 2 个 csv 文件 X 和 Y

    X 具有列 a、b、c
    Y 有 a、b、c 列

    这些行的顺序不同,并且分散在 csv 文件中。

    我将它们都导入到我的 Excel 工作表中。 我先按 c 列对它们进行排序,然后按 b 列,然后按 a 列。 你可以按照你喜欢的任何顺序去。

    通过notepad++的比较插件/Beyond Compare比较排序后的文件。

    【讨论】:

      【解决方案4】:

      您也可以使用 Powershell 执行相同的操作,如果您位于只读文件夹中,这将非常有用。

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

      您可以直接在文件夹中启动 Powershell,无需通过 cd 导航,只需在文件夹的地址栏中键入 powershell。

      【讨论】:

        【解决方案5】:

        我遇到了这个问题,为了好玩,我尝试编写一些 powershell 代码来生成“每列”差异。它慢得令人尴尬,但它更好地解决了我的问题(非常宽的 CSV 文件,所以常规 diff 真的很难解释)。使用您需要的文件致电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
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2022-01-04
          • 1970-01-01
          • 1970-01-01
          • 2015-04-12
          • 2015-10-30
          相关资源
          最近更新 更多