dbf解析_java解析FoxPro DBF数据文件

前面的博文中提到过项目中有解析dbf数据文件做导入的需求,由于项目中用到的DBF文件由FoxPro产生,本文的重点也围绕FoxPro的DBF文件展开。

其实网上有相当多的java工具,用于解析dbf文件,尝试了很多,效果都不太理想,主要问题出现在乱码问题、解析不到数据,由于个人没也时间去研究源码,其实也比较头疼byte的操作,说到底还是寄希望有个第三方的解析工具。最后让我发现了jdbc-odbc,尝试之后,发现不仅从代码的编写的容易程度还是到数据的解析出错问题都相当的完美,唯一的限制,利用jdbc-odbc解析FoxPro的dbf文件,需要安装微软提供的驱动,编程环境限于window。

由于这次做得是导入,代码的重点也放在读上:

package com.excellence.dbf.javadbf;

import java.sql.Connection;

import java.sql.DriverManager;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.ResultSetMetaData;

import java.sql.SQLException;

public class DBFJdbcOdbcTest {

public static void main(String[] args) {

Connection conn = null;

PreparedStatement pstm = null;

ResultSet rs = null;

//下面的代码其实都是基本的jdbc代码,所以编写上面基本没什么问题

String DB_URL =

"jdbc:odbc:Driver={Microsoft FoxPro VFP Driver (*.dbf)};" + //写法相对固定

"UID=;"+

"Deleted=Yes;"+

"Null=Yes;"+

"Collate=Machine;"+

"BackgroundFetch=Yes;"+

"Exclusive=No;"+

"SourceType=DBF;"+ //此处指定解析文件的后缀

"SourceDB=E:\\users\\pengsy\\DBF\\data\\main"; //此处为dbf文件所在的目录

try {

Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");

try {

conn = DriverManager.getConnection(DB_URL);

pstm = conn.prepareStatement("select * from XXB"); // 此处的XXB 为DBF数据文件的名字

rs = pstm.executeQuery();

ResultSetMetaData metaData = pstm.getMetaData();

//展示dbf元数据信息

System.out.println("metaData.getColumnCount():"+metaData.getColumnCount());

System.out.println("**************************");

for(int i = 1 ; i <= metaData.getColumnCount() ; i++){

System.out.println("metaData.getCatalogName:"+metaData.getCatalogName(i));

System.out.println("metaData.getColumnClassName:"+metaData.getColumnClassName(i));

System.out.println("metaData.getColumnDisplaySize:"+metaData.getColumnDisplaySize(i));

System.out.println("metaData.getColumnLabel:"+metaData.getColumnLabel(i));

System.out.println("metaData.getColumnName:"+metaData.getColumnName(i));

System.out.println("metaData.getColumnType:"+metaData.getColumnType(i));

System.out.println("metaData.getColumnTypeName:"+metaData.getColumnTypeName(i));

System.out.println("metaData.getPrecision:"+metaData.getPrecision(i));

System.out.println("metaData.getScale:"+metaData.getScale(i));

System.out.println("metaData.getSchemaName:"+metaData.getSchemaName(i));

System.out.println("metaData.getTableName:"+metaData.getTableName(i));

System.out.println("**************************");

}

//展示dbf中的行数据

while(rs.next()){

for(int i = 1 ; i <= metaData.getColumnCount() ; i++){

System.out.println(rs.getString(i));

}

System.out.println("*******************************************");

}

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}finally{

if(rs != null){

rs.close();

}

if(pstm != null){

pstm.close();

}

if(conn != null){

conn.close();

}

}

} catch (Exception e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}

至于FoxPro用到的驱动,这里没法提供了,oschina不支持上传附件。有需要的同学上网上下载或者找我都行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java解析DBF文件可以使用Apache Commons IO和Apache Commons Lang库。以下是一个简单的示例代码,演示了如何读取DBF文件并输出其内容: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.commons.io.IOUtils; import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.math.NumberUtils; import org.apache.commons.lang3.time.DateUtils; public class DBFReader { private String fileName; private int headerLength; private int recordLength; public DBFReader(String fileName) { this.fileName = fileName; } public void read() throws IOException { FileInputStream inputStream = new FileInputStream(fileName); byte[] headerBytes = new byte[32]; IOUtils.read(inputStream, headerBytes); headerLength = NumberUtils.toInt(StringUtils.substring(headerBytes, 8, 10)); recordLength = NumberUtils.toInt(StringUtils.substring(headerBytes, 10, 12)); byte[] recordBytes = new byte[recordLength]; while (IOUtils.read(inputStream, recordBytes) != -1) { String recordString = new String(recordBytes, "ISO-8859-1"); System.out.println(recordString); } } public static void main(String[] args) throws Exception { DBFReader reader = new DBFReader("example.dbf"); reader.read(); } } ``` 这个示例代码使用了Apache Commons IO和Apache Commons Lang库来读取DBF文件。它首先读取文件头,然后使用记录长度来读取每个记录。在每个记录中,它将字节数组转换为字符串,并将其输出到控制台。请注意,DBF文件使用ISO-8859-1编码,因此我们需要使用该编码将字节数组转换为字符串。此外,我们还需要使用Apache Commons Lang库来解析整数和日期值。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值