net core封装DBF文件处理

前言

在.net core项目中需要读写dbf文件,可以使用FastDBF操作dbf文件,十分方便,使用Nuget可以添加FastDBF

代码实现

  1  public class DBFUtil
  2     {
  3         private static List<KeyValuePair<string, PropertyInfo>> Mapping<T>() where T : class
  4         {
  5             Type type = typeof(T);
  6             var properties = type.GetProperties();
  7
  8             List<KeyValuePair<string, PropertyInfo>> result = new List<KeyValuePair<string, PropertyInfo>>(); ;
  9             //保存dbf字段和实体的映射关系
 10             //实体没有ColumnAttribute,则认为dbf字段名称和实体名称一致
 11             foreach (var pro in properties)
 12             {
 13                 var attrs = pro.GetCustomAttributes(typeof(ColumnAttribute), false);
 14                 if (attrs == null)
 15                 {
 16                     result.Add(new KeyValuePair<string, PropertyInfo>(pro.Name, pro));
 17                 }
 18                 else
 19                 {
 20                     ColumnAttribute ar = (ColumnAttribute)attrs[0];
 21                     if (ar == null)
 22                     {
 23                         result.Add(new KeyValuePair<string, PropertyInfo>(pro.Name, pro));
 24
 25                     }
 26                     else
 27                     {
 28                         result.Add(new KeyValuePair<string, PropertyInfo>(ar.Name, pro));
 29                     }
 30                 }
 31             }
 32             return result;
 33         }
 34
 35
 36         /// <summary>
 37         /// 导出dbf
 38         /// </summary>
 39         /// <typeparam name="T"></typeparam>
 40         /// <param name="list">列表数据</param>
 41         /// <param name="dbfPath">dbf保存路径</param>
 42         /// <returns></returns>
 43         public static string WritePdf<T>(List<T> list, string dbfPath) where T : class
 44         {
 45             if (list == null)
 46             {
 47                 return null;
 48             }
 49             try
 50             {
 51                 var dicProperty = Mapping<T>();
 52                 //创建dbf文件
 53                 var odbf = new DbfFile(Encoding.Default);
 54                 odbf.Open(Path.Combine(dbfPath), FileMode.Create);
 55                 //create a header
 56                 foreach (var it in dicProperty)
 57                 {
 58                     odbf.Header.AddColumn(new DbfColumn(it.Key, DbfColumn.DbfColumnType.Character, 255, 0));
 59                 }
 60
 61                 foreach (var it in list)
 62                 {
 63                     var orec = new DbfRecord(odbf.Header) { AllowDecimalTruncate = true };
 64                     foreach (var col in dicProperty)
 65                     {
 66                         var pro = col.Value;
 67                         object value = pro.GetValue(it);
 68                         if (value == null || value == DBNull.Value)
 69                         {
 70                             value = "";
 71                         }
 72                         orec[col.Key] = value.ToString();
 73                     }
 74                     odbf.Write(orec, true);
 75                 }
 76
 77                 odbf.WriteHeader();
 78
 79                 odbf.Close();
 80                 return dbfPath;
 81
 82             }
 83             catch (Exception ex)
 84             {
 85                 throw ex;
 86             }
 87
 88
 89         }
 90         /// <summary>
 91         /// 读取dbf文件
 92         /// </summary>
 93         /// <typeparam name="T"></typeparam>
 94         /// <param name="dbfPath">dbf文件路径</param>
 95         /// <returns></returns>
 96         public static List<T> ReadPdf<T>(string dbfPath) where T : class
 97         {
 98             if (!File.Exists(dbfPath))
 99             {
100                 return null;
101             }
102             List<T> list = new List<T>();
103
104             try
105             {
106                 var dicProperty = Mapping<T>();
107                 //获取一个DBF文件对象
108                 DbfFile dbf = new DbfFile(Encoding.Default);
109                 dbf.Open(dbfPath, FileMode.Open);
110
111                 //读取dbf的字段名
112                 DbfHeader dh = dbf.Header;
113                 List<string> dbfColumns = new List<string>();
114                 for (int index = 0; index < dh.ColumnCount; index++)
115                 {
116                     dbfColumns.Add(dh[index].Name);
117                 }
118                 //读取数据
119                 int i = 0;
120                 while (dbf.Read(i) != null)
121                 {
122                     //读取一行
123                     DbfRecord record = dbf.Read(i);
124                     if (record == null)
125                     {
126                         continue;
127                     }
128                     T t = Activator.CreateInstance<T>();
129                     foreach (var col in dbfColumns)
130                     {
131                         var data = dicProperty.FirstOrDefault(r => r.Key == col);
132                         if (data.Key == null)
133                         {
134                             continue;
135                         }
136                         var pro = data.Value;
137                         if (pro == null || !pro.CanWrite)
138                         {
139                             continue;
140                         }
141                         string value = record[col];
142                         if (value == null)
143                         {
144                             continue;
145                         }
146                         pro.SetValue(t, Convert.ChangeType(value.Trim(), pro.PropertyType));
147                     }
148                     list.Add(t);
149                     i++;
150                 }
151                 dbf.Close();
152                 return list;
153             }
154             catch (Exception ex)
155             {
156                 throw ex;
157             }
158
159         }
160     }

原文地址:https://www.cnblogs.com/kun2008/p/12019806.html

时间: 2024-10-10 23:03:27

net core封装DBF文件处理的相关文章

java把dbf文件写入远程2003服务器

重要的事情说三遍,有木有,java把dbf文件写入远程2003服务器,第一遍,第二遍,第三遍-够了,王二,还有完没有,赶紧点 需求 今天早晨,王二(也就是我)接到一个需求: 把行情的dbf库写入到远程windows server2003上! 分析 之前,我就写过一篇Java操作DBF文件数据库,但怎么把dbf写入到远程服务器上,这好像需要点什么. 于是我就去问度娘啊,看看有没有什么封装好的jar包之类的,好拿来用用. 折腾了一会关键字,终于找到了一篇Java读写Windows共享文件夹,感谢博主

Java读取Level-1行情dbf文件极致优化(2)

最近架构一个项目,实现行情的接入和分发,需要达到极致的低时延特性,这对于证券系统是非常重要的.接入的行情源是可以配置,既可以是Level-1,也可以是Level-2或其他第三方的源.虽然Level-1行情没有Level-2快,但是作为系统支持的行情源,我们还是需要优化它,使得从文件读取,到用户通过socket收到行情,端到端的时延尽可能的低.本文主要介绍对level-1行情dbf文件读取的极致优化方案.相信对其他的dbf文件读取应该也有借鉴意义. Level-1行情是由行情小站,定时每隔几秒把d

Sqlserver 2012 导入 DBF文件

步骤一.将dbf文件放在任意系统目录下,我放在d:\db目录下 步骤二.需安装 AccessDatabaseEngine.exe (ACE) 官网下载地址: https://www.microsoft.com/en-us/download/details.aspx?id=13255 安装之后在 sqlserver 实例下 ->"链接服务器"-> "访问接口"中会看到以下接口. 步骤三.在ssms中执行sql查询语句 select*from OPENROW

第一百六十一节,封装库--JavaScript,完整封装库文件

封装库--JavaScript,完整封装库文件 /** *feng_zhuang_ku_1.0版本,js封装库,2016/12/29日:林贵秀 **/ /** 前台调用 * 每次调用$()创建库对象,使其每次调用都是独立的对象 * $()创建库对象,有一个可选参数,参数有两种方式,1是传入的this,2是传入的字符串 * 可选参数说明: * 传入的this,this,就是当前对象本身 * * 传入的字符串,代表获取元素选择器 * 参数是元素选择器(id值.class值.标签名称)其中一样的字符串

[转载]在SQL Server 中,如何实现DBF文件和SQL Server表之间的导入或者导出?

原来使用SQL Server 2000数据库,通过DTS工具很方便地在SQL Server和DBF文件之间进行数据的导入和导出,现在安装了SQL Server2005之后,发现其提供的“SQL Server导入导出向导”中的数据源没有原来的丰富,缺少对DBF文件的支持. 1.右击数据库,选择“任务”>“导入数据”,打开“SQL Server导入和导出向导”对话框.2.在“数据源”中选择Microsoft OLE DB Provider for Visual FoxPro,单击“属性”按钮,打开“

新手上路之DBF文件的读取

初次了解DBF文件,因为有需求要将其中的数据导出,并插入到数据库中.开始的时候用Excel把它打开了,以为它就是一个Excel文件,就想着用NPOI来实现,显然是作为一个新人太天真了,后来在别人的博客上了解到,读取这个文件有多种方式,根据不同的难易用不同的方法,由于我所接触的这个文件中没有过多的约束,我也就用了最简单的一种. /// <summary> /// 读取DBF文件,此方法适用于简单的DBF文件,即类似深交所的文件 /// </summary> /// <param

c# dbf文件读写类

public class DbfReader     { private string _path; private OleDbConnection _connection; public DbfReader(string dbfPath)         { _path = dbfPath; CheckFile(); } public OleDbDataReader GetReader() { try { _connection.Open(); OleDbCommand command = n

用XSLT样式表加工后的XML显示DBF文件内容

1.程序需求 在NAS上(可以理解为局域网上一个存放了若干文件的IP地址),有若干个DBF文件,它们占用的空间都不大.现在要做一个功能,就是把这些文件每隔一段时间,做一个快照,以XML形式保存DBF文件的值.并把XML文档保存到指定位置,用已经写好的XSLT样式表,来显示这个XML文件,并提供一些XML文件的统计信息. 2.我的架构 DbfMonitor(程序根目录) | |-dbfs(目录) | | | |-dbf1(目录) | | |-dbf1.dbf | |-dbf2(目录) | | |-

由于删除DBF文件报错 —— ORA-01033: ORACLE initialization or shutdown in progress

由于移动或删除DBF文件报错:ORA-01033: ORACLE initialization or shutdown in progress 原因:一般该类故障通常是由于移动文件而影响了数据库日志文件出现损坏而导致的无法正常进行IO操作而引起的错误.ORACLE将识别为数据库未装载完成而导致出现如上错误. 故障特征:使用命令行sqlplus或PL/SQL Developer均无法打开数据库.但是可以使用sys用户以sysdba的身份登录系统 解决方法: 1. 在 ‘开始’-->‘运行’执行cm