忽略换行符的差异比较工具

25
我经常需要比较SQL存储过程以确定最新版本中发生了什么变化。但问题在于,每个人都有自己的格式风格,而SQL(通常)不关心换行符的位置(例如,在每个AND之前换行或在一行上编写WHERE子句)。
这使得查看实际区别变得非常困难(尤其是对于长存储过程)。我似乎找不到一个允许我忽略换行符(即将其视为空格)的免费diff/merge工具。到目前为止,我已经尝试了WinMerge和Beyond Compare,但没有成功。是否有人知道一个可以把这两个示例视为相同的diff工具(最好是免费的)?
例1:
the quick
brown

例2:

the
quick
brown

提前感谢。


没有免费的实用工具回答这个问题。如果有人为一个免费的实用工具提供了答案,我会给予奖励。 - Greg
2
我接受的答案提供了一个免费的实用工具。ApexSQL Refactor与他们的一堆试用软件捆绑在一起,但您可以选择仅安装该项。它非常好地集成到SQL Server Management Studio中,并且通过按Ctrl-shift-R修复整个查询或仅选定的文本。除了使比较变得非常简单外,它还具有标准化查询格式的额外奖励。此外,它非常可定制化。 - Prometheus
也许使用一些设置,meld可以完成这个任务? - Jonathan
我在这里提问并回答了这个问题:https://softwarerecs.stackexchange.com/questions/80584 简而言之,IntelliJ IDEA具有此功能。 - David Balažic
12个回答

11

我非常喜欢SourceGear的DiffMerge

它适用于所有平台,并且具有内置规则集,但允许您创建和添加自己的规则集。这意味着您可以在需要时忽略想要忽略的内容。

另外,它是免费的!


“View->Hide Unimportant Differences” 似乎能够解决问题。虽然我不确定是否相信这个设定,但我会尝试调整规则集以符合我的喜好 :) 我很喜欢有两个选项卡来加载/编辑文件。 - Greg
我使用这个工具的次数越多,就越喜欢它。我刚发现它可以集成到Windows Shell中,使得它更加方便。 - Dustin Laine
我已经尝试了两个大约2MB的文件,但它不起作用。我也尝试了一个新的规则集(忽略行结尾)。这两个文件都是相同的XML,只是一个整理过的版本而已。还有其他检查的方法吗? - Vijay
这个答案帮助了我完成了任务!最终 WinMerge 对我有用!此外,来自另一个问题的这个在线应用程序也对我有用,尽管速度要慢得多。 - Vijay
我刚刚尝试了DiffMerge_4_2_0_697_stable_x64(ZIP版本),即使打开了“隐藏不重要的差异”,它仍然显示所有更改,例如添加的制表符、添加的空行等。我正在比较*.txt文件。我有什么遗漏吗? - David Balažic
编辑:在比较Java文件时,它表现得更好,但即使在那里,它报告“a=b”与“a = b”不同,这只是一个简单的空格更改。 - David Balažic

7
我在类似情况下所做的是使用 SQL美化工具,它可以自动将两组半不同的SQL以非常相似的方式组织起来。然后我将结果粘贴并与WinMerge进行比较。
这是一个两步过程,但当涉及许多代码行时,它比许多其他选项更容易接受。 链接到基于Web的Sql Pretty printer,还不错。

你第一个链接中的工具非常适合这项任务。虽然需要花一些时间筛选试用软件并只安装免费的 SQL Server Management Studio 插件,但是这个插件允许我重新格式化过程以使其有相同的换行符。非常好的回答!现在通过 WinMerge 运行结果提供可用的结果。 - Prometheus
如果有人仍在寻找此功能,为了避免手动步骤并使重新格式化自动或半自动发生,请尝试我的WinMerge插件,它可以与开源的“Poor Man's T-SQL Formatter”库一起使用:http://www.architectshack.com/PoorMansTSqlFormatter.ashx#Download_8 - Tao

2

我喜欢Araxis merge。虽然不是免费的,但非常值得。它可以忽略任何类型的空格,如果您需要。


我正在尝试它(免费30天试用)。我听说它可以忽略换行符,所以它可能值得购买。 - Prometheus
1
比较一下,它似乎也可以做到这一点,并且价格似乎更便宜。http://www.grigsoft.com/wincmp3.htm - Greg
尝试后,比较一下它在aspx文档上运行得相当不错,但并不完全。 - Greg
1
一个不可或缺的差异比较工具。 - bvj
我无法让Araxis忽略换行符,现在将尝试使用Compare-It。 - wutzebaer
1
比较功能的使用方法:选项->比较->忽略换行符。 - wutzebaer

2

Compare++ 是一款选择,你可以在“智能”菜单中尝试“忽略代码样式更改”。它支持许多语言的结构化比较,如C/C++、JavaScript、C#、Java等。


似乎它已经不存在了。 - john k

2
您可以使用 Eclipse IDE 的数据工具项目 (DTP)。
为了展示它,我创建了两个几乎相同的 SQL 文件,并让 Eclipse 显示它们的区别。在点击“show next”之后,我进行了截屏。
正如您所看到的,它仍然会突出显示换行符,但是通过这种方式,您可以立即看到它们对 SQL 没有实质性的更改。很容易看出我将 ID 从 1 改为了 2。
以下是结果。 alt text alt text alt text

作为一个使用Visual Studio的用户,我越看到Eclipse,就越感到嫉妒。 - Greg
1
真的吗?每次都让我感到恶心。如果我整天盯着Eclipse看,我想我会退出这个行业。像素化的“非反锯齿”图形比它们应该的更让我烦恼。 - Prometheus
我不知道那个 bug。我坐在一个整天使用 Eclipse 的人旁边,而我自己则整天使用 VS。为了让 VS 达到相同的功能水平,我必须安装一些插件。 - Greg

2
无论您对“免费”(啤酒免费还是言论自由/开源)的定义如何,都可以使用Poor Man's T-SQL Formatter来实现此功能,可以使用WinMerge(使用winmerge插件)或Beyond Compare等比较工具进行命令行预格式化,使用命令行批量格式化程序。

如果您希望在不下载任何内容的情况下轻松使用它,则可以在线使用(与其非开源版本T-SQL Tidy、Instant SQL Formatter等一样):

http://poorsql.com


1
你可以使用命令行工具wdiff忽略换行符。 wdiff是一种GNU工具,可按单词比较文件。 它可以使用-n选项忽略换行符。
假设我将你的2个示例文件放入ex1.txt和ex2.txt中。 然后我们可以运行:
$> wdiff -n ex1.txt ex2.txt
the
quick
brown

实际上输出的内容就是第一个文件的内容。注意没有+或-符号,这意味着这两个文件拥有相同的字符串。
如果我在ex1.txt的末尾添加了“fox”,那么输出将如下所示:
the
quick
brown [-fox-]

如果常见单词仍然困扰您,可以添加 -3--no-common。以下是我向第一个文件添加了“fox”后的示例:
$> wdiff -n -3 /tmp/ex1.txt /tmp/ex2.txt

======================================================================
 [-fox-]
======================================================================

指出显而易见的问题,但请注意没有行号。这使得它几乎毫无价值。 - Jeff
1
有一个类似的工具叫做dwdiff,它可以打印行号。加上换行符的最后一个示例的等效命令是:dwdiff -L -3 ex1.txt ex2.txt - nofinator

1

我们的SD Smart Differencer根据精确的语法和结构比较两个源程序,而不是根据原始文本。 它通过解析(SQL)源码来实现,与编译器相同,并比较相应的编译器数据结构(例如,抽象语法树)。 因此,SmartDifference 不关心换行符、空白或插入的注释。

它报告差异,不是基于换行符,而是基于编程语言结构(变量、表达式、语句、块、函数等)以及接近程序员意图的术语(删除、插入、移动、复制、重命名),而不是基于行插入或行删除。

SQL(像许多其他计算机语言名称一样)是一系列在语法上相似但在细节上不同的计算机语言的名称。因此,对于Smart Differencer来说,您使用的SQL方言很重要。我们有针对PLSQL和SQL2011的SQL前端(因此也有SmartDifferncers)。只要您的SQL保持在这两者的范围内,Smart Differencer就可以为您工作;如果您使用SQL Server或Postgres的额外好处,Smart Differencer目前无法帮助您。[我们作为业务的一部分开发语言解析器,因此我认为这只是延迟问题而不是永远无法解决]。

虽然OP在详细信息中询问了SQL,但他的标题问题是与语言无关的。 除了SQL之外,已经有许多其他广泛使用的语言的SmartDifferencers:C、C++、C#、Java等。


1

另一个选择是Emacs的Ediff。如果你不怕Emacs的话,它会非常好用。


0

PHPStorm的差异工具的“忽略空格:全部”命令可以完美地按照您的要求执行。它还集成了对许多版本控制系统(如SVN、git等)的支持,以及集成的SQL支持!

虽然不是免费的,但时间也不是免费的。想浪费时间用困难的方法做吗?请继续。

我仍然无法相信这是2014年,而这不是所有差异工具的标准功能!!

顺便说一句,我相信WebStorm的差异工具也可以使用。


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