数据标准检查工具_4.附件

这是数据标准检查工具的附录。可以查看属性名称数字后缀的处理、标准词典模拟方法、标准检验属性参考信息、许可证、VBA代码。这是上一篇文章的延续。

数据标准检查工具_3.按案例标准检查结果

4.数据标准检查工具附件

4.1.属性名中数字后缀的处理

如果属性名中有数字后缀(后缀数字),则排除该数字,查找标准词词典或标准词词典。在查找到的标准词或标准词组合的结果后加上数字后缀。

속성명의 숫자 Suffix에 대한 처리
属性名中数字后缀的处理

在上图中,属性“personal targeting 1”的物理名称被创建为“PERSN_TGT_YN1”。属性名称终止符通常标识为“是否”。

属性名的数字后缀的处理逻辑如下。

  • 只查找并存储要检查的属性名后面连续的数字(a),删除数字,检查
  • 检查结果,将“标准字逻辑名组合”和“标准字物理名组合”中存储的数字a附加在右边

4.2.标准词典模拟法

为了在未确定单词物理名称时检查输入属性名称的单词组合是否成功,即是否可以将其注册为标准术语,在“标准单词词典”表中注册一个逻辑名称,而物理名是“(”+逻辑名+“)”组成可以模拟。在这种情况下,标准检查结果中的“标准字物理名称组合”项显示为绿色。

표준단어사전 Simulation 방법
标准词典模拟法

如果在标准检查结果中点击“添加到词库”按钮,则为所有“附加候选词”创建每个词的物理名称“(”+逻辑名称+“)”并添加到词库。不会添加已经注册的单词。

顺便说一下,如果你想自动生成一个词的物理名称的缩写,你可以使用这个 VBA 项目中包含的用户函数“Generate Abbreviation”。该函数的源代码如下。

Public Function 약어생성(aFullName As String, Optional aMaxSize = 4) As String
    Dim sFullName As String, sAbbName As String
    Dim i As Integer
    
    '영문 Full Name 중에 포함된 '-' 는 공백으로 변경하여 처리한다.
    sFullName = Trim(Replace(aFullName, "-", " "))
    
    '/* 영문 Full Name이 숫자로 시작하는 경우 단어 순서를 변경한다. (첫번째, 두번째 단어 순서만 변경) */
    Select Case Mid(sFullName, 1, 1)
        Case "0" To "9"
            sFullName = Trim(단어순서변경(sFullName))
    End Select

    sFullName = StrConv(sFullName, vbProperCase)
    sFullName = Replace(sFullName, "A ", "")
    sFullName = Replace(sFullName, "An ", "")
    sFullName = Replace(sFullName, "The ", "")

    If InStr(1, sFullName, " ") = 0 Then '/* 영문FullName이 하나의 단어일 경우*/
        If Len(sFullName) <= 4 Then '/* 영문FullName의 길이가 4 이하 일 경우 */
            sAbbName = sFullName
        Else
            '/* 영문FullName의 4자 이후 단어들이 모두 모음인 경우 - 앞 4자리 단어를 축약어로 사용 */
            If 모음제거(Mid(sFullName, 5)) = "" Then
                sAbbName = Mid(sFullName, 1, 4)
            Else
                sAbbName = Mid(sFullName, 1, 1) + 모음제거(Mid(sFullName, 2))   '-- 모음시작 단어 첫모음 살림
                '/* 축약 결과 길이제한 : 최대 aMaxSize 자리까지 */
                If Len(sAbbName) > aMaxSize Then
                    sAbbName = Mid(sAbbName, 1, aMaxSize)
                End If
            End If

        End If
    Else '/* 영문FullName이 여러 단어로 구성되어 있을 경우 */
        Dim iBlankCnt As Integer
        iBlankCnt = Len(sFullName) - Len(Replace(sFullName, " ", ""))

        '각 단어 첫글자
        sAbbName = sFullName

        Dim iPos As Integer, sChar As String, sAbbTmp As String
        If iBlankCnt = 1 Then '/* 단어수가 2개인 경우 - 각 단어의 시작 2글자 조합으로 생성 */
            sAbbName = 모음제거(sAbbName)
            i = InStr(1, sAbbName, " ") + 1
            sAbbName = UCase(Left(sAbbName, 2) + Mid(sAbbName, i, 2))
        ElseIf iBlankCnt <= 4 Then '/* 단어수가 4개 이하인 경우 - 첫글자 조합으로 생성 */
             For iPos = 1 To Len(sAbbName)
                sChar = Mid(sAbbName, iPos, 1)
                If (sChar >= "A" And sChar <= "Z") Or (sChar >= "0" And sChar <= "9") Then
                    sAbbTmp = sAbbTmp + sChar
                End If
                If Len(sAbbTmp) >= aMaxSize Then GoTo Exit_For1
             Next iPos
Exit_For1:
             sAbbName = sAbbTmp
        Else
            '/* 단어의 길이가 최대 허용자리수 이하인 경우 - 그대로 사용 */
            If Len(Replace(sFullName, " ", "")) <= aMaxSize Then
                sAbbName = UCase(Replace(sFullName, " ", ""))
            Else
                Dim sInText As String
                sInText = 등위접속사정리(UCase(sFullName))
                '/* 등위접속사가 존재하면 첫글자들로 구성 */
                If sInText <> sFullName Then
                    sAbbName = 모음제거(sInText)
                    For iPos = 1 To Len(sAbbName)
                        sChar = Mid(sAbbName, iPos, 1)
                        If (sChar >= "A" And sChar <= "Z") Or (sChar >= "0" And sChar <= "9") Then
                            sAbbTmp = sAbbTmp + sChar
                        End If
                        If Len(sAbbTmp) >= aMaxSize Then GoTo Exit_For2
                    Next iPos
Exit_For2:
                    sAbbName = sAbbTmp
                Else
                    '/* 두단어로 구성된 경우, 각각의 단어에서 앞 2자리 문자를 가지고 약어 생성 */
                    Dim iUnitLen As Integer, aWordArray() As String, sWord As String
                    iUnitLen = 2
                    aWordArray = Split(sFullName)
                    For iPos = 0 To UBound(aWordArray)
                        sWord = aWordArray(iPos)
                        If Len(sWord) = iUnitLen Then
                            sAbbTmp = sAbbTmp + sWord
                        Else
                            If 모음제거(Mid(sWord, iUnitLen + 1)) = "" Then
                                sAbbTmp = sAbbTmp + Mid(sWord, 1, iUnitLen)
                            Else
                                sAbbTmp = sAbbTmp + Mid(Mid(sWord, 1, 1) + 모음제거(이중자음정리(Mid(sWord, 2))), 1, iUnitLen)
                            End If
                        End If
                    Next
                    sAbbName = sAbbTmp
                End If
            End If

        End If

    End If
    약어생성 = UCase(sAbbName)
End Function

4.3.标准检测对象属性参考信息说明

在标准化期间更改属性名称或更改数据类型/长度。需要管理参考信息的项目,例如更改前的属性名称、列名称、数据类型/长度或标准化工作期间的注释。

在“物业名称标准化”表标准检查结果的右侧,创建项目以管理标准检查结果的附加信息和每个物业名称所需的附加参考信息。对于参考信息,用户可以添加必要的项目。

표준점검대상 속성의 참조정보
标准检验物业参考资料

▼ 标准维护附加信息

  • 物理名称长度:作为标准检查结果创建的物理名称的长度。根据物理名称最大长度选项设置,在条件格式中以红色显示超过最大长度(例如 26)的单元格的背景色。
  • Number of words: 标准检查结果创建的物理名称的组合词数
  • _Number:作为标准检查结果创建的物理名称中“_”字符的数量
  • 属性名CNT:输入的属性名个数(如果有重复的属性名,即属性名CNT为2个及以上,则单元格背景色显示为红色)

▼ 附加参考信息

  • 更改前的属性名称:属性名称标准检查前初始输入的属性名称。
    • 它不是自动设置的,而是在创建属性名称列表后,用户直接通过复制和粘贴进行设置。
    • 用于在多次执行标准检查的同时更改属性名称时检查最初输入的属性名称是什么,建议尽可能使用它。
  • 更改后的属性名称:当前属性名称(自动设置为公式)
  • As-Is property name:输入的属性名称的As-Is property name(As-Is跟踪需要)
  • As-Is column name:输入的属性名称的 As-Is 列名称(As-Is 跟踪需要)
  • As-Is DataType:输入的属性名称的 As-Is 数据类型(As-Is 跟踪需要)
  • 属性名是否更改:比较更改前后的属性名,更改后打“O”
  • 待确认项目:自由记录和利用标准检验工作中需要检查的项目
  • 其他(按需添加):在“必填项”右侧增加一栏,用于管理必填项

4.4.执照

对需要和想使用该标准检测工具的用户没有任何限制。许可证的内容是通过应用 BSD-2 许可证简要编写的。

  • 作 者:李永民
  • 电子邮件: leeyoungmin@gmail.com
  • 博客: https://prodskill.com/
  • 知乎: https://github.com/DAToolset
  • 许可内容:基本上遵循github仓库中规定的BSD-2许可。如果未指定,请按照以下说明进行操作
    • 1.版权人的声明:版权人的姓名、邮箱地址、博客地址、github仓库地址必须原样使用。如果更改源代码并使用它,您可以添加与第二作者相关的内容。
    • 2.免责声明:版权人不对因使用本源代码和工具而引起的任何问题负责。
    • 如果满足上述条件,则允许用于所有目的,例如学习/利用等个人使用,在工作中使用本工具,或通过更改源代码将本工具包含在商业产品中使用.
    • 无法删除此许可证内容。
  • 告诉我
    • 您不必公开衍生作品的源代码。但是,如果这不是问题,我希望您能告诉我您将它用于哪个辅助工作。您可以通过电子邮件发送或作为博客评论留下。
    • 还请将工具功能中的错误或改进请求、指南文档中的错误或通过电子邮件或博客评论提出的改进请求通知我们。

供您参考,开放工具的许可证在下面的博文中公布。

https://prodtool.tistory.com/notice/19

#ToDo:更改链接

4.5.组织您的 VBA 代码

工作表、用户窗体、模块、类列表。本工具的VBA代码由Module和Class组成,以提高复用性和可维护性,按照MVC设计模式,M(Model)是Class,V(View)是Excel UI,C(Control)是Module。

VBA 코드 구성
VBA代码配置

▼ 工作表对象

  • Program Sheet: shtRun (property name standardization): 管理属性名称标准检查的函数和属性列表的表
  • 数据表:程序引用的表:标准词词典、标准术语词典、标准领域词典

▼ 表单对象

  • frmAbout:“关于…… ” 单击按钮时显示的表单。包含说明文字

▼ 模块对象

  • modControlStd:与标准检查相关的功能,例如创建标准检查结果和添加候选词
  • modTest:测试代码
  • modUtil:常用功能(日志记录、格式化、去后缀等)
  • Mod缩写生成:通过输入单词的英文全名和缩写的最大位数来创建缩写

▼ 类模块对象

  • CDBConnectionUnit:提供数据库连接、SQL 执行和结果创建等功能的类,用于从标准 Repository DB 更新标准词/术语/域
  • CStdDomain:一个标准域单元的类
  • CStdDomainDic
    • 用于将标准域列表搜索为字典结构(键值)的类
    • Key:域名分类名
    • Value:对应领域分类法的Domain Collection
  • CStdTerm:一类标准术语
  • C标准词条
    • 用于搜索标准术语列表作为字典结构(键值)的类
    • Key:术语逻辑名称
    • 值:CStdTerm 类的一个实例
    • 读取标准术语词典并将其作为词典结构加载到内存中
  • CStdWord:一类标准词
  • CStdWordCol:用于管理标准词的同音字列表的类
  • CStdWordDic
    • 用于搜索标准单词列表的类作为字典结构(键值)
    • Key: 词逻辑名
    • 值:CStdWord类的实例集合(CStdWordCol对象)
    • 在内部管理以物理词名称为键的附加词典
    • 在读取标准词典并将其作为词典加载到内存的过程中,检查重复的逻辑名称和重复的物理名称。

4.6.主要 VBA 类描述和整体逻辑流程总结

主要类是管理标准词词典的“CStdWordDic”、管理标准术语词典的“CStdTermDic”和管理标准域词典的“CStdDomainDic”。整个逻辑在“modControlStd”模块的“标准检查”程序中处理。

总结如下。

4.6.1. CStdWordDic 类

CStdWordDic 구성
配置 CStdWordDic

CStdWordDic 类通过使用Dictionary 类型的成员变量来管理每个标准单词的列表。 Key为字名(字逻辑名),Value一般为一个字对象(CStdWord类型)。当词的逻辑名允许重复时,即允许同音异义词时,Value 是一个Collection 对象,它持有多个词对象(CStdWord 类型)。在内部,它额外管理一个字典,以单词的物理名称为键,单词对象为值。

为了判断是否存在同音字,是否按Value对象的类型分类,Value对象是否与Collection相同,区分Collection的项数是1还是2或更多,是按类型分类的。

因此,在“modControlStd”模块的“标准检查”程序中,多处出现了以下类型的代码。

If TypeOf oStdWordObj Is CStdWord Then
    '논리명이 유일한 경우
    Set oStdWord = oStdWordObj
    sToken = oStdWord.m_s단어논리명
    ...
ElseIf TypeOf oStdWordObj Is CStdWordCol Then
    '동음이의어가 있어 논리명이 2개 이상인 경우
    b동음이의어Matched = True
    ...
End If

关于Dictionary类型请参考以下内容。

  • Excel VBA 的 Dictionary 类型有一个由 Key 和 Value 组成的 HashMap 结构。
  • 它不是基本类型,在引用“Microsoft Scripting Runtime”库后使用,或者声明为对象类型并使用CreateObject(“Scripting.Dictionary”)创建实例。

4.6.2. CStdTermDic 类

CStdTermDic 구성
配置 CStdTermDic

CStdTermDic 类使用 Dictionary 类型成员变量管理每个标准术语的列表。 Key是term的逻辑名,Value是term实体(CStdTerm类型)。用于物业标准检查时判断术语单位是否匹配的逻辑。

4.6.3. CStdDomainDic 类

CStdDomainDic 구성
配置 CStdDomainDic

CStdDomainDic 类使用字典类型成员变量管理每个标准域的列表。 Key为领域分类名,Value为领域集合。域集合的项是 CStdDomain 类型的域对象。

4.6.4.整体逻辑流程总结

전체 로직 흐름 요약
整体逻辑流程总结

整个逻辑在模块 modControl 的“标准检查”过程中实现。该过程的简要总结如下。

  1. 从每个标准单词/术语/域词典表中读取数据并创建每个类类型的变量。它在每个类类型的 Load() 过程中实现。
  2. 读取要检查的属性列表并将它们存储在 Variant 数组中。
  3. 对于每个待检查的属性,使用标准的字典key-value结构进行查找,检查结果存储在一个Variant类型的数组中。处理完成后,将存储在 Variant 类型中的检查结果输出到工作表中。

数据标准检查工具的描述到此结束。如果您有任何问题,请在评论中留下。


数据标准检查工具可以在下面的 github 存储库中找到。

https://github.com/DAToolset/ToolsForDataStandard


<< 相关文章列表 >>

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

zh_CN简体中文