我需要在windows7中比较两个csv文件。 我该如何继续实现这一目标。我想看看这两个文件的差异,就像我们可以在 Linux 中使用 tkdiff 一样。
建议:
cmd
并按 Enter 打开 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
不存在,则会自动创建。这是我发现非常有用的另一个选项,如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 和数据帧。 只是一个友好的提示...
我今天做了这个。
假设我们有 2 个 csv 文件 X 和 Y
X 具有 a、b、c 列
Y 具有 a、b、c 列
行的顺序不同,并且分散在 csv 文件中。
我将它们都导入到我的 Excel 工作表中。 我首先按 c 列排序,然后按 b 列排序,然后按 a 列排序。 你可以按照你喜欢的顺序去。
通过notepad++的比较插件/Beyond Compare比较排序后的文件。
我遇到了这个问题,为了好玩,我尝试编写一些 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
}
您还可以使用 Powershell 执行相同的操作,如果您位于只读文件夹中,这会很有用。
compare-object -ReferenceObject (Get-Content filename1.CSV) -DifferenceObject (Get-content filename2.CSV)
您可以直接在文件夹中启动 Powershell,无需通过 cd 导航,只需在文件夹的地址栏中输入 powershell。
Notepad++ 将通过比较插件为您提供快速而肮脏的解决方案:
如何做:
瞧!
如果您想比较两个 Excel 文件,您可以将工作表导出为 CSV 并执行上述操作。
我这样做是为了比较两个巨大的 CSV 文件,两者都大约有 400,000 行,而且效果非常好。