C# 模板文件比对——增强版

    xiaoxiao2021-03-25  81

    前言

    之前讨论过这个话题,具体参见C#模板文件比对,但只讨论了上传文件与模板文件的字段名称是否能够对应,而没有讨论二者关于字段类型、字段长度的对比。此次,将在前文的基础之上,重点讨论字段的类型和长度是否能够匹配。

    辅助知识

    DataTable 里可以获取列的集合DataColumnCollection,遍历即可得到每一个字段的名称。 但不能得到字段类型和长度。

    思路

    回顾最初的目的:对比上传文件与模板是否能够对应(匹配)。

    此处的匹配,指的是完全一样,即字段个数,字段名称,字段类型,字段长度。

    那么问题便转换成了如何获取模板文件和上传文件的字段名称,字段类型和字段长度。

    解决办法

    1.字段名称的获取

    字段名称的获取,可以通过将模板文件和上传文件转换成相同的格式(此处是DataTable)来获取。

    常见的模板格式是DBF和EXCEL

    DBF文件的解析与封装参见C#封装DBF文件到DataTable

    EXCEL文件的解析与封装参见C#封装EXCEL文件到DataTable

    2.字段类型和长度获取

    原始文件(模板和上传文件) - 缺点:很难直接获取字段名 - 优点:能够获取字段的类型和长度

    3.实现流程

    通过将其转换成DataTable,进而获取二者字段名的集合。以字段名为依据,对比相应的字段类型和长度。

    以DBF文件为例,实现对比模板文件的精确对比

    public static Boolean IsSameFormat(string initName, string testName) { DataColumnCollection initDCC = DbfToDataTable(initName).Columns; DataColumnCollection testDCC = null; //1.判断内容是否为DBF文件 try { testDCC = DbfToDataTable(testName).Columns; } catch (Exception) { return false; } //2.判断列的个数是否相同 if (initDCC.Count != testDCC.Count) {//列的个数不相同,直接报错 return false; } DbfFile dbf = new DbfFile(Encoding.Default); dbf.Open(initName, FileMode.OpenOrCreate); DbfHeader initHeader = dbf.Header; dbf.Open(testName, FileMode.OpenOrCreate); DbfHeader testHeader = dbf.Header; dbf.Close(); //3.判断列名是否相同 for (int i = 0; i < initDCC.Count; i++) { DataColumn initDTC = initDCC[i]; if (testDCC.Contains(initDTC.ColumnName))//1.判断列名 { //4.在列名相同的基础上,判断类型长度是否相同 DbfColumn ininDbfC = initHeader[initDTC.ColumnName]; DbfColumn testDbfC = testHeader[initDTC.ColumnName]; if ((ininDbfC.ColumnType == testDbfC.ColumnType) && (ininDbfC.Length == testDbfC.Length) && (ininDbfC.DecimalCount == testDbfC.DecimalCount)) { continue; } else { return false; } } else { return false; } } return true; }
    转载请注明原文地址: https://ju.6miu.com/read-34564.html

    最新回复(0)