我需要在Windows7中比较两个CSV文件。请问如何进行?我想看到这两个文件的不同之处,就像在Linux中使用tkdiff一样。
我需要在Windows7中比较两个CSV文件。请问如何进行?我想看到这两个文件的不同之处,就像在Linux中使用tkdiff一样。
建议:
cmd
并按下 Enter 打开一个命令提示符窗口cd C:\path\to\your\directory
更改当前路径以到达两个CSV文件所在位置提示:要将从剪贴板复制的路径粘贴到命令提示符窗口中,您可以右键单击终端窗口或按下 Shift+Insert。
fc filename1.csv filename2.csv > outfile.txt
命令比较两个文件。outfile.txt
中。如果 outfile.txt
不存在,则会自动创建。这里有另一种选项,我认为非常有用,如此处所述:
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和数据框。友情提示...
我曾经遇到过这个问题,为了好玩,我尝试编写了一些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)
zsv
具有快速、开源和跨平台的compare
功能(免责声明:我是作者之一):https://github.com/liquidaty/zsv/blob/main/docs/compare.md - mwag