您的位置:首页 > 编程语言 > C#

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

2017-03-12 16:25 471 查看


前言

之前讨论过这个话题,具体参见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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息