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

问题描述 投票:0回答:6

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

windows csv excel-2010
6个回答
27
投票

建议:

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

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

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

8
投票

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

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

其中

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

您还可以使用以下方法将差异打印到文件

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

顺便说一句,我发现

findstr
fc
更准确,输出也更易读。


更新
这对于“较小”的文件非常有效。 对于较大的文件,您可能会收到

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比较排序后的文件。


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,无需通过 cd 导航,只需在文件夹的地址栏中输入 powershell。


0
投票

Notepad++ 将通过比较插件为您提供快速而肮脏的解决方案:

Comparing two CSV files with Notepad++

如何做:

  • 插件 -> 插件管理... -> 找到“比较”并单击“安装”。
  • 打开两个 CSV 文件。
  • 选择第一个文件,然后插件 -> 比较 -> 设置为第一个比较。
  • 选择第二个文件,然后插件 -> 比较 -> 比较。

瞧!

如果您想比较两个 Excel 文件,您可以将工作表导出为 CSV 并执行上述操作。

我这样做是为了比较两个巨大的 CSV 文件,两者都大约有 400,000 行,而且效果非常好。

© www.soinside.com 2019 - 2024. All rights reserved.