65.9K
CodeProject 正在变化。 阅读更多。
Home

比较器 - 数据源比较器

starIconstarIconstarIconstarIconstarIcon

5.00/5 (78投票s)

2017年5月31日

LGPL3

15分钟阅读

viewsIcon

87655

downloadIcon

4357

一个用于比较来自两个来源(SQL 数据库、Excel、CSV 或 XML 文件)的表格数据的简单程序

引言

当您想比较来自两个来源的表格数据时,此应用程序可能会很有用,即

  • 使用关键字段识别来自指定来源的行是否匹配(通过键搜索配对)
  • 比较已找到的配对行中特定字段的内容
  • 识别在另一个来源中没有匹配的行
  • 识别在另一个来源中有多于一个配对的行(键不唯一)
  • 分析结果
  • 根据预配置的设置(配置文件)执行定期比较任务,并通过电子邮件发送结果或以通用格式保存

无需安装 - 只需运行 Comparator.exe

操作流程

首先…

从头开始或基于加载的配置文件创建比较设置

或者从文件或最近打开的列表中加载现有配置文件

然后…

  1. 定义两个来源
  2. 配置数据和结果处理的设置
  3. 设置用于数据比较和显示的源字段,并定义配对选择的条件
  4. 根据需要定义从命令行启动比较的选项

最后…

通过按“比较”按钮运行比较过程,并在新窗口中检查结果

此外

数据源设置

源名称将显示在比较结果、配置文件名称和邮件主题中,默认建议使用。

根据源类型:数据库、Excel、文本 (CSV) 或 XML 文件,您将需要配置各种设置。

数据库

使用任何可以通过 OleDB 或 ODBC 访问的数据源,以使用 SQL 代码请求数据。

  1. 打开“连接并运行查询”配置表单
  2. 设置连接配置。为简化操作,通过 OleDB 连接 MSSQL、Sybase 和 Oracle 的主要连接设置显示在单独的菜单中。对于通用情况(OleDB 或 ODBC),需要连接字符串。
  3. 输入 SQL 代码脚本
  4. 运行脚本。为了获得来自来源的最新字段列表,必须在设置要比较的字段之前运行 SQL 脚本。

注意:如果脚本返回多个数据集,则仅考虑第一个。脚本的选定部分可以运行以进行调试。

Excel

  1. 打开 Excel 文件或选择当前打开的文件之一。您可以根据应用程序路径指定文件路径。
  2. 选择工作表。
  3. 选择要从所选范围的第一行值(如果未设置范围,则为整个工作表)填充的字段名称。否则,字段名称将显示为列字母。
  4. 打开/将所选的 Excel 工作簿置于顶层。
  5. 手动设置范围或直接在工作表上选择。如果未定义任何范围边界,则将考虑“已使用范围”的边界。
  6. 根据配置的设置,查看将要接收的数据。

XML

要进行比较,XML 数据必须首先转换为表格。配置转换过程

  1. 打开 XML 配置设置表单
  2. 选择 XML 文件(您可以根据应用程序路径指定文件路径)
  3. 在需要时设置代码页码(例如 1251, 866)或通用页面名称(例如 UTF8, cp866)。如果未设置,编码将由 XML 文件头中的“encoding”属性默认定义。
  4. 选择在转换前预使用 XSLT 的选项
    • 不使用 – 不使用
    • 从脚本 – XSLT 脚本按钮会启用一个编辑器,您需要在其中输入 XSL 脚本,以便将 XML 脚本预先转换为另一个 XML,然后再将其转换为表格视图
    • 从文件 – 选择用于相同目的的 XSL 文件(您可以根据应用程序路径指定文件路径)
  5. 设置标签的路径(以 XPath 格式),该标签将用作表格数据行的基础,该数据行将在转换后创建。

  6. 选择定义表格字段的方法,这些字段将在转换后创建
    • 来自标签的数据 – 字段将由根据在 (5) 中设置的 XPath 选择的标签的子标签定义。
    • 来自属性的数据 – 字段将由根据在 (5) 中设置的 XPath 选择的标签的属性定义。
    • 使用字段映射 – 此选项将禁用所有先前的字段定义选项,并启用用于定义字段的标签或属性的路径设置(以 XPath 格式)。这些路径必须基于在 (5) 中定义的标签进行设置。在这种情况下,按“字段映射”按钮将启用一个列表,其中必须指明名称和路径,并且在需要时,还需指明在指定路径中未找到数据时使用的默认值。如果已经收到了转换结果,您可以通过选择相应的菜单项将字段从结果添加到列表中。

  7. 要验证 XML 转换过程,请按“转换”。然后将读取所选的 XML 文件,并在需要时通过 XSLT 进行预转换。要查看结果,请按“准备好的 XML”。

    根据在 (5) 和 (6) 中配置的设置,将从准备好的 XML 文件创建数据表。要查看此表,请按“结果”。

分隔文本

为所选文件定义字段分隔符(默认使用“tab”)和编码:代码页码(例如 1251, 866)或通用页面名称(例如 UTF8, cp866)。如果未设置,编码将默认为操作系统的当前 ANSI 代码页。字段名称将由第一行名称定义,类似于 Excel 文件源。要在单独的窗口中查看分隔数据,请按“查看数据”。您可以根据应用程序路径指定文件路径。

字段配置设置

源设置完成后,定义要比较的数据字段

  1. 打开字段列表(源 A 将显示在左侧,源 B 在右侧)。
  2. 勾选字段以选择它们进行比较。对应关系(配对)将按从上到下的顺序设置。要定义特定的配对,请使用蓝色箭头更改字段顺序。两个源中选定字段的数量可以不相等,在这种情况下,未配对的字段将不进行比较,但会显示在结果中。
  3. 定义所选字段的类型 – 键、比较或仅显示(无)。
  4. 根据需要清除先前的选择。
  5. 将所选字段添加到列表中。

    字段列表可根据需要进行编辑

  6. 删除所选行。
  7. 按行顺序定义配对,忽略键。
  8. 匹配所有字段。
  9. 更改结果中的字段顺序。
  10. 定义字段处理类型
  • – 关键字段,当它们匹配时,将定义来自源的行配对
  • 匹配 – 此数据将在找到的行配对中进行比较

处理设置

  • 仅显示差异 – 结果不包括匹配的行
  • 仅显示源 A 中的记录 – 结果包括源 A 中未配对的字段
  • 仅显示源 В 中的记录 – 结果包括源 B 中未配对的字段
  • 检查重复行 – 为每个关键字段集搜索所有配对;如果找到多个配对,它将被标记为重复。此设置可能会减慢处理速度。如果未勾选,搜索将在找到第一个配对后停止。
  • 区分大小写 – 比较过程中区分大小写
  • 将 Null 视为空字符串null 值将被处理为空字符
  • 尝试将文本转换为日期或数字 – 将尝试将文本字段转换为日期或数字格式,例如,‘20151231’ 和 ’31.12.2015’ 将被匹配为相等的值。

查看结果

比较结果视图的要点(见下图)

  1. 结果显示在单独的窗口中,根据比较设置,将提供各种结果集。您可以在这些集合之间切换
    • 差异 – 存在差异的行配对
    • 相同 – 没有差异的行配对
    • 仅在源 A 中 – 源 A 中未能在源 B 中找到配对的行
    • 仅在源 В 中 – 源 B 中未能在源 A 中找到配对的行
  2. 差异以红色标记;关键字段以蓝色标记;匹配的字段以绿色标记。
  3. 差异”和“相同”结果集中的标题和行成对显示:第一行来自源 A,第二行来自源 B(后者用颜色标记)。
  4. 使用“搜索”字段搜索整个结果表或特定列,或用它来筛选当前列中的数据。
  5. 使用“差异”按钮跳转到下一个差异,“”按钮跳转到下一个关键字段,“重复”按钮跳转到下一个“重复”行。所有按钮上都有关于热键定义的提示。
  6. 如果一行包含在多个配对中,它将被标记为“重复”,并带有字母“R”,并提示其在源中的编号(从 0 开始)。
  7. 结果可以在 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 类的对象并检查它;

  • 在窗口模式下

    • 订阅实现 IViewIViewSource 接口的对象的事件(参见项目 “Common” 中的 Views.cs)。在此应用程序中,Winform 类 FormView 实现了 IView(参见 FormView.cs),用户控件 SourcePanel 实现了 IViewSource(参见项目 “Sources”)。

    • 定义用于将配置文件数据传输到 IViewIviewSource 的对象

    • 控制选择字段对的过程

  • 启动从源准备数据的过程,调用接收内容数据的方法(参见项目“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的后代对象。它可能是 DbContentExcelContentCsvContentXmlContent 类,它们提供了从特定类型的源接收数据的方法的实现。
一些特性

  • 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”、带 XmlControllerFormXml、来自项目“Common”的静态类。

关注点

特别感谢 Pavel Torgashov 提供了他出色的 FastColoredTextBox 组件,帮助我们输入 SQL 和 XSLT 代码! :)

历史

  • 2017 年 5 月:初始版本
© . All rights reserved.