比较器 - 数据源比较器





5.00/5 (78投票s)
一个用于比较来自两个来源(SQL 数据库、Excel、CSV 或 XML 文件)的表格数据的简单程序
引言
当您想比较来自两个来源的表格数据时,此应用程序可能会很有用,即
- 使用关键字段识别来自指定来源的行是否匹配(通过键搜索配对)
- 比较已找到的配对行中特定字段的内容
- 识别在另一个来源中没有匹配的行
- 识别在另一个来源中有多于一个配对的行(键不唯一)
- 分析结果
- 根据预配置的设置(配置文件)执行定期比较任务,并通过电子邮件发送结果或以通用格式保存
无需安装 - 只需运行 Comparator.exe。
操作流程
首先…
从头开始或基于加载的配置文件创建比较设置
或者从文件或最近打开的列表中加载现有配置文件
然后…
- 定义两个来源
- 配置数据和结果处理的设置
- 设置用于数据比较和显示的源字段,并定义配对选择的条件
- 根据需要定义从命令行启动比较的选项
最后…
通过按“比较”按钮运行比较
过程,并在新窗口中检查结果
此外
数据源设置
源名称将显示在比较结果、配置文件名称和邮件主题中,默认建议使用。
根据源类型:数据库、Excel、文本 (CSV) 或 XML 文件,您将需要配置各种设置。
数据库
使用任何可以通过 OleDB 或 ODBC 访问的数据源,以使用 SQL 代码请求数据。
- 打开“连接并运行查询”配置表单
- 设置连接配置。为简化操作,通过 OleDB 连接 MSSQL、Sybase 和 Oracle 的主要连接设置显示在单独的菜单中。对于通用情况(OleDB 或 ODBC),需要连接字符串。
- 输入 SQL 代码脚本
- 运行脚本。为了获得来自来源的最新字段列表,必须在设置要比较的字段之前运行 SQL 脚本。
注意:如果脚本返回多个数据集,则仅考虑第一个。脚本的选定部分可以运行以进行调试。
Excel
- 打开 Excel 文件或选择当前打开的文件之一。您可以根据应用程序路径指定文件路径。
- 选择工作表。
- 选择要从所选范围的第一行值(如果未设置范围,则为整个工作表)填充的字段名称。否则,字段名称将显示为列字母。
- 打开/将所选的 Excel 工作簿置于顶层。
- 手动设置范围或直接在工作表上选择。如果未定义任何范围边界,则将考虑“已使用范围”的边界。
- 根据配置的设置,查看将要接收的数据。
XML
要进行比较,XML 数据必须首先转换为表格。配置转换过程
- 打开 XML 配置设置表单
- 选择 XML 文件(您可以根据应用程序路径指定文件路径)
- 在需要时设置代码页码(例如 1251, 866)或通用页面名称(例如 UTF8, cp866)。如果未设置,编码将由 XML 文件头中的“encoding”属性默认定义。
- 选择在转换前预使用 XSLT 的选项
- 不使用 – 不使用
- 从脚本 – XSLT 脚本按钮会启用一个编辑器,您需要在其中输入 XSL 脚本,以便将 XML 脚本预先转换为另一个 XML,然后再将其转换为表格视图
- 从文件 – 选择用于相同目的的 XSL 文件(您可以根据应用程序路径指定文件路径)
- 设置标签的路径(以 XPath 格式),该标签将用作表格数据行的基础,该数据行将在转换后创建。
- 选择定义表格字段的方法,这些字段将在转换后创建
- 来自标签的数据 – 字段将由根据在 (5) 中设置的 XPath 选择的标签的子标签定义。
- 来自属性的数据 – 字段将由根据在 (5) 中设置的 XPath 选择的标签的属性定义。
- 使用字段映射 – 此选项将禁用所有先前的字段定义选项,并启用用于定义字段的标签或属性的路径设置(以 XPath 格式)。这些路径必须基于在 (5) 中定义的标签进行设置。在这种情况下,按“字段映射”按钮将启用一个列表,其中必须指明名称和路径,并且在需要时,还需指明在指定路径中未找到数据时使用的默认值。如果已经收到了转换结果,您可以通过选择相应的菜单项将字段从结果添加到列表中。
- 要验证 XML 转换过程,请按“转换”。然后将读取所选的 XML 文件,并在需要时通过 XSLT 进行预转换。要查看结果,请按“准备好的 XML”。
根据在 (5) 和 (6) 中配置的设置,将从准备好的 XML 文件创建数据表。要查看此表,请按“结果”。
分隔文本
为所选文件定义字段分隔符(默认使用“tab”)和编码:代码页码(例如 1251, 866)或通用页面名称(例如 UTF8, cp866)。如果未设置,编码将默认为操作系统的当前 ANSI 代码页。字段名称将由第一行名称定义,类似于 Excel 文件源。要在单独的窗口中查看分隔数据,请按“查看数据”。您可以根据应用程序路径指定文件路径。
字段配置设置
源设置完成后,定义要比较的数据字段
- 打开字段列表(源 A 将显示在左侧,源 B 在右侧)。
- 勾选字段以选择它们进行比较。对应关系(配对)将按从上到下的顺序设置。要定义特定的配对,请使用蓝色箭头更改字段顺序。两个源中选定字段的数量可以不相等,在这种情况下,未配对的字段将不进行比较,但会显示在结果中。
- 定义所选字段的类型 – 键、比较或仅显示(无)。
- 根据需要清除先前的选择。
- 将所选字段添加到列表中。
字段列表可根据需要进行编辑
- 删除所选行。
- 按行顺序定义配对,忽略键。
- 匹配所有字段。
- 更改结果中的字段顺序。
- 定义字段处理类型
- 键 – 关键字段,当它们匹配时,将定义来自源的行配对
- 匹配 – 此数据将在找到的行配对中进行比较
处理设置
- 仅显示差异 – 结果不包括匹配的行
- 仅显示源 A 中的记录 – 结果包括源 A 中未配对的字段
- 仅显示源 В 中的记录 – 结果包括源 B 中未配对的字段
- 检查重复行 – 为每个关键字段集搜索所有配对;如果找到多个配对,它将被标记为重复。此设置可能会减慢处理速度。如果未勾选,搜索将在找到第一个配对后停止。
- 区分大小写 – 比较过程中区分大小写
- 将 Null 视为空字符串 –
null
值将被处理为空字符
- 尝试将文本转换为日期或数字 – 将尝试将文本字段转换为日期或数字格式,例如,‘
20151231
’ 和 ’31.12.2015
’ 将被匹配为相等的值。
查看结果
比较结果视图的要点(见下图)
- 结果显示在单独的窗口中,根据比较设置,将提供各种结果集。您可以在这些集合之间切换
- 差异 – 存在差异的行配对
- 相同 – 没有差异的行配对
- 仅在源 A 中 – 源 A 中未能在源 B 中找到配对的行
- 仅在源 В 中 – 源 B 中未能在源 A 中找到配对的行
- 差异以红色标记;关键字段以蓝色标记;匹配的字段以绿色标记。
- “差异”和“相同”结果集中的标题和行成对显示:第一行来自源 A,第二行来自源 B(后者用颜色标记)。
- 使用“搜索”字段搜索整个结果表或特定列,或用它来筛选当前列中的数据。
- 使用“差异”按钮跳转到下一个差异,“键”按钮跳转到下一个关键字段,“重复”按钮跳转到下一个“重复”行。所有按钮上都有关于热键定义的提示。
- 如果一行包含在多个配对中,它将被标记为“重复”,并带有字母“R”,并提示其在源中的编号(从 0 开始)。
- 结果可以在 Excel 或 HTML 中打开,一个名为“results.xls”或“results.htm”的文件将在应用程序设置中定义的文件夹中创建。结果也可以另存为 HTML。
例如 - 我们有两个来源,它们的比较结果显示在窗口中,然后显示在 Excel 或 HTML 文件中
启动模式
窗口模式(使用通用应用程序设置)
> comparator [-profile:"[路径]文件名"]
- [-profile:"[路径]文件名"] – 将加载配置文件。
如果未定义配置文件,应用程序将使用新的空配置文件或模板配置文件启动(如应用程序设置中所配置)。
控制台模式(使用控制台模式应用程序设置)
> comparator -batch -profile:"[路径]文件名" [-path:"路径"] [-log:"[路径]文件名"] [-type:excel|html] [-sendto:"地址[;地址...]"] [-file:"文件名"] [-open]
必需设置
- -batch – 定义控制台模式 – 将使用指定配置文件的控制台模式(见下文)
- -profile:"路径文件名" – 包含配置文件的文件
可选设置(如果未定义 -batch
,则忽略),优先级高于应用程序配置文件和设置中的相应设置
-path:"路径"
– 结果保存的路径(末尾不要使用“/”)-log:"[路径]文件名"
– 日志文件-type:excel|html
– 结果文件类型(Excel 或 HTML)-sendto:"地址[;地址...]"
– 邮件列表;如果指定但列表为空,则不会发送结果-file:"文件名"
– 结果文件名-open
– 如果指定,将打开结果文件
在控制台模式下启动后,将发生以下情况:检查配置文件数据、搜索并连接到源、比较并创建结果文件、邮寄和/或打开结果文件。
该过程将被写入日志文件
-
[08.02.2016 20:37:07.776] >>> 开始处理 "testprofile.xml"
-
[08.02.2016 20:37:08.192] 配置文件已加载
-
[08.02.2016 20:37:09.977] 已比较
-
[08.02.2016 20:37:10.002] 结果保存在 "C:\Comparator\results\testprofile__20160208_203709.xls"
应用程序设置
控制台模式设置
- 结果类型 – 结果文件类型(Excel 或 HTML)
- 结果路径 – 结果文件路径(默认使用应用程序设置)
- 结果文件 – 结果文件名(默认使用配置文件名加上取决于结果类型的文件扩展名)
- 文件名中包含时间戳 – 勾选后,比较启动的日期和时间将添加到文件名中
- 将结果发送至 – 勾选后 - 指定邮件列表(用分号分隔)并在将结果发送为:中选择结果文件的发送选项
- Attachment
- ZIP – 文件作为 Gzip 压缩包(文件名.gz)附加 – 适用于大文件
- 文本 – 作为 HTML 文本在邮件正文中发送
- 链接 – 指向结果文件的链接,无附件
可选:您可以在邮件主题中定义邮件主题(默认为“比较‘源 A 名称’和‘源 B 名称’”)
如果未勾选将结果发送至或邮件列表为空,则不会发送结果。
对于其他邮件选项,例如连接 SMTP 服务器,请参阅通用设置。
通用设置
对于全局设置,请使用应存储在应用程序文件夹中的 Comparator.xml 文件。如果该文件不存在,则在首次启动时将创建该文件。
示例
<?xml version="1.0" encoding="windows-1251"?>
<Config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<optionsList>
<Options Host="BATCH">
<ProfileFolder>C:\Comparator\profiles</ProfileFolder>
<ResultFolder>C:\Comparator\results</ResultFolder>
<LogFile>C:\Comparator\Comparator.log</LogFile>
<HtmlStylesFile>C:\Comparator\styles.css</HtmlStylesFile>
<SendOptions>
<Server>smtp.server.ru</Server>
<Port />
<Ssl>false</Ssl>
<User />
<Pwd />
<PwdEncr />
<From>Comparator@server.ru</From>
<FromAlias>Comparator</FromAlias>
</SendOptions>
</Options>
<Options Host="HOST1">
<RecentFiles>
<file>C:\Comparator\profiles\SomeProfile.xml</file>
<file>C:\Comparator\profiles\test.xml</file>
</RecentFiles>
<ProfileFolder>C:\Comparator\profiles</ProfileFolder>
<ResultFolder>C:\Comparator\results</ResultFolder>
<HtmlStylesFile>C:\Comparator\styles.css</HtmlStylesFile>
<PatternFile>C:\Comparator\pattern.xml</PatternFile>
</Options>
<Options Host="HOST2">
..............
</Options>
</optionsList>
</Config>
控制台模式设置位于具有属性 Host="BATCH"
的 <Options> 标签中。
正常(窗口)模式的设置在具有属性 Host="Host_name"
的 <Options>
标签中为每个主机定义。
首次启动时,主机将设置默认设置,可以通过手动编辑文件来更改这些设置。
以下标签可用于存储设置
- <ProfileFolder> - 存储配置文件的文件夹(默认为应用程序文件夹中的“profile”)
- <ResultFolder> - 存储结果文件的文件夹(默认为应用程序文件夹中的“result”)
- <LogFile> - 日志文件名(默认为应用程序文件夹中的 comparator.log)
- <HtmlStylesFile> - 用于结果样式设计的 CSS 文件(默认为应用程序文件夹中的 style.css)
<PatternFile>
- 默认模式配置文件<SendOptions>
- 邮件选项<Server>
- SMTP 服务器<Port>
- 端口(默认为 25)<Ssl>
- 使用 SSL (true/false)<User>
- SMTP 服务器的登录名<Pwd>
- SMTP 服务器的密码,在此处指定,然后在首次启动时加密,存储在<PwdEncr>
中,并从<Pwd>
中删除;<PwdEncr>
- SMTP 服务器的加密密码<From>
- 邮件列表的发件人<FromAlias>
- 发件人的别名</SendOptions>
<RecentFiles>
- 最近的配置文件<file>
最近打开的配置文件的路径/名称<file>
上一个打开的配置文件的路径/名称,依此类推</RecentFiles>
Using the Code
该解决方案由五个项目组成,位于此处。让我们简要讨论一下每个项目。
项目 “Comparator“
Master 类 (Master.cs)
Master
类的对象在应用程序启动时创建,并控制应用程序在窗口或批处理模式下的操作。
此对象
-
管理应用程序设置 - 创建/读取/保存(通过序列化)一个
Options
类的对象(参见项目 “Common
” 中的 Options.cs); -
管理配置文件设置 - 创建/读取/保存(通过序列化到 XML 文件)一个
Profile
类的对象并检查它; -
在窗口模式下
-
订阅实现
IView
和IViewSource
接口的对象的事件(参见项目 “Common
” 中的 Views.cs)。在此应用程序中,Winform 类FormView
实现了IView
(参见 FormView.cs),用户控件SourcePanel
实现了IViewSource
(参见项目 “Sources
”)。 -
定义用于将配置文件数据传输到
IView
和IviewSource
的对象 -
控制选择字段对的过程
-
-
启动从源准备数据的过程,调用接收内容数据的方法(参见项目“
Sources
”中抽象类 SourceContent
的后代); -
通过调用
DSComparer 静态
类的方法(项目“DSComparer
”)启动接收数据的比较,并以CompareResult
类的对象形式接收比较结果 -
控制比较过程的进度及其中断
-
控制比较结果的输出 - 输出到窗体(窗口模式)或文件(批处理模式)
-
通过静态的
Mailer
类(参见项目 “Common
” 中的 SendMail.cs)控制比较结果的发送(在批处理模式下) -
使用实现
ILoger
接口的对象提供必要的消息(参见项目 “Common
” 中的 Common.cs)。在批处理模式下,这是一个Loger
类的对象,它使用静态
类Log
的方法写入日志文件。在窗口模式下,消息的输出是通过实现ILoger
接口的FormView
类进行的。
FormView 类 (FormView.cs)
表示应用程序的用户界面。
它实现了 IView
接口,用于创建、修改、验证和保存配置文件数据,启动比较过程以及查看最新的比较结果。
包含两个实现了 IViewSource
接口的 UserControl
。
要选择用于比较的字段对,会打开 FormSelectPair
窗体。
当比较开始时,它会打开 FormCompare
窗体,以显示数据接收和比较的进度,并提供中断过程的可能性。
项目 “Sources“
Source 类 (Source.cs)
描述用于比较的数据源。该类的对象与 Profile
类的对象(在项目 Comparator
中)一起为两个源中的每一个创建。Source
类的对象包含一个属性,该属性指向抽象类 SourceContent
的后代对象。它可能是 DbContent
、ExcelContent
、CsvContent
或 XmlContent
类,它们提供了从特定类型的源接收数据的方法的实现。
一些特性
ExcelContent 类
- 使用静态类 ExcelProc
的方法(参见项目“Common
”中的ExcelProc.cs)来访问打开的 Excel 工作簿DbContent 类
- 实现ISqlModel
接口,该接口描述了连接和查询,使用SqlController
类接收数据(参见项目“SqlSource
”中的SqlController.cs)XmlContent 类
– 使用XmlController 静态
类来处理 XML 数据 - 读取、xsl 转换和转换为表格
SourcePanel 类 (SourcePanel.cs)
这是一个 UserControl
,用于显示所选源的设置。
对于数据库和 XML 源,它会打开带有详细设置和处理源数据能力的窗体 - SqlView
(参见项目“SqlSource
”中的SqlView.cs)和 FormXml
。
对于 Excel 和 CSV 源,它会打开一个用于快速查看数据的窗体 - FormFlatData
(参见项目“Common
”中的FormFlatData.cs)
项目 “SqlSource”
SqlController 类 (SqlController.cs)
创建或在创建时接收一个实现 ISqlModel
的对象 - 连接和查询参数。
创建或在创建时接收一个实现 ISqlView
的对象(参见项目 “Common
” 中的 Views.cs)- 一个用于配置连接和执行查询的接口。在此应用程序中,Winform 类 SqlView
实现了 ISqlView
。
将数据从 ISqlModel
发送到 ISqlView
,并订阅 ISqlView
事件。
控制数据接收过程的进度及其中断。
项目 “DSComparer”
DSComparer 类 (DSComparer.cs)
包含“Compare
”方法,该方法根据指定的设置比较两个 DataTables
,并返回一个包含比较结果的 CompareResult
对象。
CompareResult 类 (CompareResult.cs)
包含比较结果以及将其输出到窗体(FormResult
)和 html / excel(使用 css 样式)的方法。
项目 “Common”
包含上述项目的通用过程和定义。
注意:某些类和项目不依赖于应用程序的其他部分,可以单独使用。例如 – 项目“SqlSource
”、项目“DSComparer
”、带 XmlController
的 FormXml
、来自项目“Common
”的静态
类。
关注点
特别感谢 Pavel Torgashov 提供了他出色的 FastColoredTextBox 组件,帮助我们输入 SQL 和 XSLT 代码! :)
历史
- 2017 年 5 月:初始版本