- 浏览: 2184581 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (682)
- 软件思想 (7)
- Lucene(修真篇) (17)
- Lucene(仙界篇) (20)
- Lucene(神界篇) (11)
- Solr (48)
- Hadoop (77)
- Spark (38)
- Hbase (26)
- Hive (19)
- Pig (25)
- ELK (64)
- Zookeeper (12)
- JAVA (119)
- Linux (59)
- 多线程 (8)
- Nutch (5)
- JAVA EE (21)
- Oracle (7)
- Python (32)
- Xml (5)
- Gson (1)
- Cygwin (1)
- JavaScript (4)
- MySQL (9)
- Lucene/Solr(转) (5)
- 缓存 (2)
- Github/Git (1)
- 开源爬虫 (1)
- Hadoop运维 (7)
- shell命令 (9)
- 生活感悟 (42)
- shell编程 (23)
- Scala (11)
- MongoDB (3)
- docker (2)
- Nodejs (3)
- Neo4j (5)
- storm (3)
- opencv (1)
最新评论
-
qindongliang1922:
粟谷_sugu 写道不太理解“分词字段存储docvalue是没 ...
浅谈Lucene中的DocValues -
粟谷_sugu:
不太理解“分词字段存储docvalue是没有意义的”,这句话, ...
浅谈Lucene中的DocValues -
yin_bp:
高性能elasticsearch ORM开发库使用文档http ...
为什么说Elasticsearch搜索是近实时的? -
hackWang:
请问博主,有用solr做电商的搜索项目?
Solr中Group和Facet的用法 -
章司nana:
遇到的问题同楼上 为什么会返回null
Lucene4.3开发之第八步之渡劫初期(八)
明天,持续更新Lucene系列博文,欢迎收看!
Lucene群交流:324714439
下面进入正题
最近客户提了个新的需求,需要我们的程序支持如下几种文件的解析
编号 | 文件格式 |
1 | XML |
2 | Excel |
3 | Access |
4 | DBF |
5 | MDB |
可能有些朋友,不知道DBF这种格式的文件是什么东西,在这之前,散仙,先小小科普下这种古董级的数据库格式,来看下百度百科是怎么介绍的。
一种特殊的文件格式!表示数据库文件,Foxbase,Dbase,Visual FoxPro,等数据库处理系统所产生的数据库文件!
DBF 数据库可以分为 dBase III 、foxpro 格式两类。
DBF 数据库是常用的桌面型数据库,它曾经被各企业、事业单位广泛使用。现在,虽然已经有了很多的各种各样的小、中、大型数据库,DBF 数据库依然被很多单位用于数据交换。
下面我们来看下Foxbase DBF的截图.
DBF,以及Access都是微软支持的数据库产品,解析时使用jdbc-odbc桥接的方式,可以很方便解析。
关于MDB,其实是SQL Server分离后的数据库,这个直接可以直接导入数据库使用,然后使用Java的JDBC读取即可,这个需求很简单,散仙在这里就不用多演示了,下面,我们来重点看下其他4种文件的Java解析方法
1.解析XML,散仙使用的是jdom2,解析起来也比较方便快捷,XML格式如下
核心代码如下
File f = new File("E:\\data\\test.xml"); Document doc=sax.build(f);//解析file的xml文件 Element root=doc.getRootElement();//获取根节点 List<Element> eles= root.getChildren();//获取根节点下面子节点的集合 // System.out.println(eles.size()); List<XmlEntity> xmls=new ArrayList<XmlEntity>(); for(Element e:eles){ String ui=e.getChildText("ui"); String ti=e.getChildText("ti"); String ta=e.getChildText("ta"); String dp=e.getChildText("dp"); String vi=e.getChildText("vi"); String ip=e.getChildText("ip"); String pg=e.getChildText("pg"); String mh=e.getChildText("mh"); xmls.add(new XmlEntity(ui, ti, ta, dp, vi, ip, pg, mh)); // System.out.println(e.getChildText("ui")); // System.out.println(e.getChildText("ti")); // System.out.println(e.getChildText("ta")); // System.out.println(e.getChildText("dp")); // System.out.println(e.getChildText("vi")); // System.out.println(e.getChildText("ip")); // System.out.println(e.getChildText("pg")); // System.out.println(e.getChildText("mh")); // System.out.println("================================="); } DAO.add(xmls);//持久化到数据库中 System.out.println("添加成功!"); // System.out.println("获取根节点的名字 :"+root.getName());
2,使用POI解析Excel,格式如下
核心代码如下
/** * 判断单元格格式 * **/ private static String getCellValue(HSSFCell cell) { String cellValue = ""; DecimalFormat df = new DecimalFormat("#"); switch (cell.getCellType()) { case HSSFCell.CELL_TYPE_STRING: cellValue = cell.getRichStringCellValue().getString().trim(); break; case HSSFCell.CELL_TYPE_NUMERIC: cellValue = df.format(cell.getNumericCellValue()).toString(); break; case HSSFCell.CELL_TYPE_BOOLEAN: cellValue = String.valueOf(cell.getBooleanCellValue()).trim(); break; case HSSFCell.CELL_TYPE_FORMULA: cellValue = cell.getCellFormula(); break; default: cellValue = ""; } return cellValue; } /** * 读取Excel * **/ public static List<ExcelEntity> readExcel(String filePath) throws Exception { FileInputStream fis = new FileInputStream(filePath); // 根据excel文件路径创建文件流 POIFSFileSystem fs = new POIFSFileSystem(fis); // 利用poi读取excel文件流 HSSFWorkbook wb = new HSSFWorkbook(fs); // 读取excel工作簿 HSSFSheet sheet = wb.getSheetAt(0); // 读取excel的sheet,0表示读取第一个、1表示第二个..... // 获取sheet中总共有多少行数据sheet.getPhysicalNumberOfRows() // System.out.println(sheet.getPhysicalNumberOfRows()); List<ExcelEntity> excels=new ArrayList<ExcelEntity>(); for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) { HSSFRow row = sheet.getRow(i+1); //忽略首行,标题行 取出sheet中的某一行数据 if (row != null) { // 获取该行中总共有多少列数据row.getLastCellNum() ExcelEntity excel=new ExcelEntity(); HashMap<Integer, String> map=new HashMap<>(); for (int j = 0; j < row.getLastCellNum(); j++) { //System.out.println(row.getLastCellNum()); //System.exit(0); HSSFCell cell = row.getCell(j); // 获取该行中的一个单元格对象 if(cell==null){ cell=row.createCell(j);//如果某个单元格为空的话,就创建一个,否则会报异常 } String str= getCellValue(cell); map.put(j, str); // System.out.println(str); //} }
3,使用JDBC-ODBC桥接方式读取Access文件,使用Acces
与DBF都需要配置桥接模式,在控制面板里,选择管理工具里配置
核心代码如下,
try { Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); con = DriverManager.getConnection("jdbc:odbc:ss", bulidPath, "");//加载驱动,默认密码,空字符串即可 //System.out.println("Access连接:"+con); } catch (Exception e) { e.printStackTrace(); }
AccessBase ab=new AccessBase(); Connection con=ab.getConnection("zdbz.mdb"); String sql="select * from test";//查询表 PreparedStatement ps=con.prepareStatement(sql); ResultSet rs=ps.executeQuery(); //ResultSetMetaData s=rs.getMetaData(); // int i=s.getColumnCount(); //System.out.println(i); List<ExcelEntity> list=new ArrayList<ExcelEntity>(); while(rs.next()){ ExcelEntity xml=new ExcelEntity(); xml.setUi(rs.getString(1)); xml.setTi(rs.getString(2)); xml.setTa(rs.getString(3)); xml.setDp(rs.getString(4)); xml.setVi(rs.getString(5)); xml.setIp(rs.getString(6)); xml.setPg(rs.getString(7)); xml.setAb(rs.getString(8)); xml.setKw(rs.getString(9)); xml.setMh(rs.getString(10)); list.add(xml); } DAO.addAccess(list); // System.out.println(i); rs.close(); ps.close(); con.close();
4,最后在来说一下,比较纠结的DBF的解析,关于这个东西,散仙以前也没用过,现在客户有这种需求,自然得做好,于是乎Google了一把,效果似乎还不错,第一页上基本全是有关于,JAVA解析DBF格式的,当时我还在想,得来全不费工夫,于是,找了一篇,看起来似乎挺靠谱的解析博客,拷贝了其中的代码,拿过来使用,结果报了各种异常,这种方式是用流读取的,然后直接解析流,提取每一行数据,还附带一个jar包,散仙后面会把jar给传上来,我们先看下这种方式的代码:
package com.dbhelper; import java.io.FileInputStream; import java.io.InputStream; import com.hexiong.jdbf.DBFReader; public class ParseDBF { public static void main(String[] args) { readDBF("C:\\Users\\cuichao\\Desktop\\zdbz\\test.DBF"); } public static void readDBF(String path) { InputStream fis = null; try { // 读取文件的输入流 fis = new FileInputStream(path); // 根据输入流初始化一个DBFReader实例,用来读取DBF文件信息 DBFReader reader = new DBFReader(fis); //DBFReader reader=new DBFReader("C:\\Users\\cuichao\\Desktop\\zdbz\\test.DBF"); // System.out.println(reader); // 调用DBFReader对实例方法得到path文件中字段的个数 int fieldsCount = reader.getFieldCount(); System.out.println(fieldsCount); Object[] s= reader.nextRecord(); while(reader.nextRecord()!=null&&reader.nextRecord().length>0){ for(int i=0;i<reader.nextRecord().length;i++){ System.out.println(reader.nextRecord()[i]); } } } catch (Exception e) { e.printStackTrace(); } finally { try { // fis.close(); } catch (Exception e) { } } } }
这种流读取的方式,散仙也看了下源码,代码比较繁琐,而且有好多限制不能用,比如说,读取某列的字符长度不能大于8,或者包含某个C或D的字符的不能用,等等。散仙,猜想这个发博客的人,是根据自己的业务定义的,这也不能怪人家,各个业务的需求都不一样,难免会出现这种情况。 下面,我们来看看,最王道,最通用的解析方法, 既然,它是数据库,那么我们为什么不按数据库的方式来搞呢? 用流读取的方式,不通用,而且异常百出,按数据库的方式,解决,才是最完美的方法。
首先配置好的桥接,截图如下
核心代码如下
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");//加载驱动 try { //conn = DriverManager.getConnection(DB_URL); conn = DriverManager.getConnection("jdbc:odbc:ss","test.dbf","");//无密码则空字符串 pstm = conn.prepareStatement("select * from test"); // 此处的XXB 为DBF数据文件的名字 rs = pstm.executeQuery();
至此,完美解决DBF数据库文件读取。网上的东西,太杂了,所以,我们要理智判断,取其精华,去其糟粕,为我所用。
发表评论
-
记一次log4j不打印日志的踩坑记
2019-09-22 01:58 1572### 起因 前几天一个跑有java应用的生产集群(200多 ... -
在Java里面如何解决进退两难的jar包冲突问题?
2019-07-23 19:10 1234如上图所示: es api组件依赖guava18.0 ... -
如何轻松理解二叉树的深度遍历策略
2019-07-03 23:33 1129我们知道普通的线性数据结构如链表,数组等,遍历方式单一 ... -
为什么单线程Redis性能也很出色
2019-01-21 18:02 2208高性能的服务器,不一 ... -
如何将编程语言里面的字符串转成数字?
2019-01-11 23:23 2094将字符串转成数字在很 ... -
为什么Java里面String类是不可变的
2019-01-06 18:36 1669在Java里面String类型是不可变对象,这一点毫无疑问,那 ... -
关于Java里面volatile关键字的重排序
2019-01-04 18:49 1068Java里面volatile关键字主 ... -
多个线程如何轮流打印ABC特定的次数?
2018-12-11 20:42 6043之前的一篇文章,我给 ... -
聊聊Java里面的引用传递
2018-11-16 21:21 990长久以来,在Java语言里面一直有一个争论,就是Java语言到 ... -
理解计数排序算法的原理和实现
2018-10-11 10:03 2092计数排序(Counting sort) ... -
理解Java7和8里面HashMap+ConcurrentHashMap的扩容策略
2018-09-06 11:31 3389### 前言 理解HashMap和Con ... -
关于Java里面多线程同步的一些知识
2018-07-18 09:45 1108# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
Java单例模式之双检锁深入思考
2018-07-08 12:25 3290# Java单例模式之双检锁 ... -
关于Java里面多线程同步的一些知识
2018-07-08 12:23 1122# 关于Java里面多线程同步的一些知识 对于任何Java开 ... -
重新认识同步与异步,阻塞和非阻塞的概念
2018-07-06 14:30 1474# 重新认识同步与异步 ... -
线程的基本知识总结
2018-06-27 16:27 1062### (一)创建线程的方式 (1)实现Runnable接口 ... -
Java里面volatile关键字修饰引用变量的陷阱
2018-06-25 11:42 1387# Java里面volatile关键字修饰引用变量的陷阱 如 ... -
关于Java里面的字符串拼接,你了解多少?
2018-06-25 11:28 1371# 关于Java里面的字符串 ... -
深入理解Java内存模型的语义
2018-06-25 11:39 740### 前言 Java内存模型( ... -
如何证明Java多线程中的成员变量数据是互不可见的
2018-06-21 10:09 1502前面的几篇文章主要介绍了Java的内存模型,进程和线程的定义, ...
相关推荐
Java 解析 DBF 文件方案 Java 解析 DBF 文件方案是使用 Java 语言来读取和解析 DBF 文件的方法。DBF 文件是一种常见的数据库文件格式,广泛应用于许多行业。为了读取和解析 DBF 文件,需要使用 Java 语言中的数据库...
### Java解析DBF文件的方法与解析驱动介绍 #### DBF文件简介 DBF(dBase File)是一种常用的数据文件格式,最初由dBase数据库应用程序创建并使用。它以表格形式存储数据,支持多种不同的数据库管理系统(DBMS)。...
Java中没有内置的库直接处理`.dbf`文件,但我们可以利用第三方库如`JDBF`或者自定义代码来实现解析。以下是一种可能的方法: 1. **读取文件头**:打开.dbf文件,读取前32个字节获取文件头信息。这包括创建日期、...
使用 Java 实现对 dbf 文件的简单读写 Java 是一种广泛使用的编程语言,对于读写 dbf 文件具有重要的应用价值。本文将介绍使用 Java 实现对 dbf 文件的简单读写,包括读写 dbf 文件的基本步骤、相关类的介绍、代码...
Java解析某些DBF文件时喜欢出错误,错误一:Failed to parse Number: For input string: "-.---" , 错误二:有时候有些被标记为删除的数据读取不出来,已打成jar包
在Java中处理DBF文件,我们可以借助特定的库,如JDBF,它提供了读取和写入DBF文件的功能。本篇文章将深入探讨如何使用Java实现DBF文件的读取与创建。 1. **DBF文件格式介绍** DBF文件格式源于dBase,是早期个人...
在Java编程环境中,解析Shapefile(.shp)文件是一项常见的任务,特别是在地理信息系统(GIS)应用中。Shapefile是一种广泛用于存储地理空间数据的开放格式。为了在Java中处理这些文件,我们可以利用开源库GeoTools...
本文将深入探讨如何使用Java来快速导出大量数据到DBF文件,以及如何利用`javadbf.jar`库进行高效操作。 首先,DBF文件是基于dBase III、IV或FoxPro等早期数据库管理系统的文件格式。它以ASCII文本存储表格数据,...
打包文件路径 : dbf4j\artifacts\dbf4j_jar java -jar dbf4j.jar test.xml 20190416 test.xml 是配置文件,20190416是日期参数
在Java编程中,有时我们需要处理各种类型的文件,其中包括DBF(dBASE)文件。DBF是一种常见的数据库文件格式,常用于存储结构化数据。本文将详细介绍如何使用javadbf库来读取和生成DBF文件。 javadbf是Java的一个第...
Java操作DBF文件是数据库处理中的一个特殊场景,DBF是一种常见的数据库文件格式,常见于FoxPro、dBase等早期数据库管理系统中。在Java中处理DBF文件,主要是为了兼容这些旧系统的数据或者进行特定的数据交换。下面...
`dbf-jdbc-wisecoders`是一个Java库,它提供了对DBF文件的读写功能,使得开发者能够通过Java语言方便地操作这些文件。 这个工具包的主要特点和功能包括: 1. **JDBC接口**:`dbf-jdbc-wisecoders`通过提供一个类似...
标题"Java读取DBF文件jar包和测试用例"表明我们要讨论的是一个Java库,它专门用于读取DBF文件,并且已经包含了测试代码来验证其功能。这个jar包名为"javadbf-0.4.0.jar",这可能是一个第三方库,它提供了Java API来...
根据需求生成dbf文件,根据模板dbf文件生成特定格式的dbf文件,可以帮助解决项目中的特殊需求问题,更好地完整项目。 dbf文件是一种存储数据的格式,所以在某些需求中,会需要使用。
考虑到DBF文件的结构和读写方法,Java开发者可设计几个专门的类来处理DBF文件。DBFField类负责读取字段子记录中的信息;DBFHeader类用于处理表头信息,并通过DBFField数组读取所有列信息;DBFReader和DBFWriter类...
在Java编程语言中,处理DBF文件可以帮助开发者与这些历史数据进行交互,尤其是在需要迁移旧系统数据或处理遗留项目时。这篇内容将详细介绍如何使用Java来读取DBF文件。 1. DBF文件结构: DBF文件主要由文件头、...
Apache Commons项目中的DBF库提供了一套工具类,可以解析DBF文件并将其转换为Java对象。通过`DbfReader`类,可以打开DBF文件,获取字段信息,并迭代记录进行处理。 5. **代码示例**: 使用JDBF库读取DBF文件的...
在IT行业中,数据库文件格式是数据存储和交换的重要方式之一,DBF(dBase File Format)就是其中一种常见的表格数据格式,尤其在早期的桌面数据库系统中广泛应用。本篇文章将详细探讨如何使用Java来读写DBF文件,...
`shp`文件通常与`.dbf`(数据库文件)、`.prj`(投影信息文件)和其他辅助文件一起使用,共同构成一个完整的数据集。本篇文章将详细讲解如何使用`meteoInfo`和`geotools`这两个Java库来解析`shp`文件,提取其中的...