DBF文件的解析介绍

news2024/11/18 1:25:21

1.基本介绍

DBF是Digital Beam Forming的缩写,“.dbf”文件扩展名代表据库处理系统所产生的数据库文件,起初意为保存数据的文件是一个简单的表,可以使用ASCII字符集添加、修改、删除或打印数据,随着产品变得越来越流行,底层文件类型 .dbf 得到扩展,并添加了其他文件以增强数据库系统的功能。所以DBF是一个非常小型的数据库文件,它支持的文本类型的长度也非常短,不超过256个长度。

2.JavaDBF介绍

JavaDBF 是一个用于读写 XBase 文件的 Java 库。有很多遗留应用程序都以 .dbf 作为主要存储格式。JavaDBF 最初是为此类应用程序的数据传输而编写的。直到 90 年代末,dBase 及其同类产品仍然是中小型企业应用程序最喜欢的数据库平台。它们需要较低的硬件配置并且开发成本较低。最终,功能更强大的桌面数据库(例如 Microsoft Access)出现了,DBF 文件格式仍然是存储和传输数据的最简单方法之一。(理论上:什么年代了,还不淘汰这种远古时期的数据库数据文件;实际上:无论什么年代了也架不住有这种业务需求)。

Github上有许多关于DBF的开源读写库,我这边使用的较多的是JavaDBF,它是一个用于读写 XBase 文件的 Java 库。有很多遗留应用程序都以 .dbf 作为主要存储格式。JavaDBF 最初是为此类应用程序的数据传输而编写的,支持几乎所有 XBase 数据类型,这些类型被解释为适当的 Java 类型,参考下表显示了匹配类型,如下:

2.1 读和写的类型

XBase    Type

XBase    Symbol

Java    Type used in JavaDBF

Character

C

java.lang.String

Numeric

N

java.math.BigDecimal

Floating Point

F

java.math.BigDecimal

Logical

L

java.lang.Boolean

Date

D

java.util.Date

2.2 读的类型

FoxPro    Type

Symbol

Java    Type used in JavaDBF

Currency

Y

java.math.BigDecimal

Long

I

java.lang.Integer

Date Type

T

java.util.Date

Timestamp

@

java.util.Date

AutoIncrement

+

java.lang.Integer

Memo

M

java.lang.String or byte[]

Binary

B

byte[] or java.lang.Double

Blob

W

byte[]

General

G

byte[]

Picture

P

byte[]

VarBinary

Q

byte[]

Varchar

V

java.lang.String

Double

O

java.lang.Double

3.代码实现

创建Maven项目,集成pom坐标时注意使用JavaDBF相关的坐标,经过在“https://mvnrepository.com/”查找dbf和JavaDBF相关的关键字后,输入后者更加精确,本次选择的坐标为com.github.albfernandez,最后更新为为2022年的,相对稍显新一些,而且在GitHub上有此项目的源代码“GitHub - albfernandez/javadbf: Java library for reading and writing Xbase (dBase/DBF) files.”,参考如下最新版本的坐标:

<!-- https://mvnrepository.com/artifact/com.github.albfernandez/javadbf -->
<dependency>
    <groupId>com.github.albfernandez</groupId>
    <artifactId>javadbf</artifactId>
    <version>1.14.0</version>
</dependency>

3.1 写DBF代码

@RunWith(JUnit4.class)
public class DbfWriterTest {

    @Test
    public void writeDbf() throws Exception {
        File desktop = FileSystemView.getFileSystemView().getHomeDirectory();
        File dbfFile = new File(desktop , "用户信息.dbf");
        Charset charset = Charset.forName("GBK");
        try (DBFWriter writer = new DBFWriter(new FileOutputStream(dbfFile) , charset)) {
            //设置字段类型
            DBFField[] fields = new DBFField[4];
            //字段 id
            DBFField idField = new DBFField("id" , DBFDataType.NUMERIC , 16);
            fields[0] = idField;
            //字段 name
            DBFField nameField = new DBFField("name" , DBFDataType.CHARACTER , 32);
            fields[1] = nameField;
            //字段 bonus
            DBFField performanceField = new DBFField("bonus" , DBFDataType.NUMERIC , 16 , 2);
            fields[2] = performanceField;
            //字段 birthday
            DBFField birthdayField = new DBFField("birthday" , DBFDataType.DATE);
            fields[3] = birthdayField;

            writer.setFields(fields);
            //设置数据
            SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");
            for (int i=1 ; i <= 10 ; i++) {
                Object[] values = new Object[4];
                values[0] = 1000 + i;
                values[1] = "chen冬冬_" + i;
                values[2] = new BigDecimal(Math.random() * 10000).setScale(2 , RoundingMode.HALF_UP);
                values[3] = dateFormat.parse("2023070" + i);
                writer.addRecord(values);
            }
        }
        System.out.println(String.format("文件 %s 已生成" , dbfFile.getAbsolutePath()));
    }

}

(生成示例)

3.2 读DBF代码

@RunWith(JUnit4.class)
public class DbfReadTest {

    @Test
    public void readDbf() throws Exception {
        File desktop = FileSystemView.getFileSystemView().getHomeDirectory();
        File dbfFile = new File(desktop , "用户信息.dbf");
        if (! dbfFile.exists()) {
            System.err.println(String.format("文件 %s 未找到,请先运行文件写入示例!" , dbfFile.getAbsolutePath()));
            return;
        }
        Charset charset = Charset.forName("GBK");
        try (DBFReader reader = new DBFReader(new FileInputStream(dbfFile) , charset)) {
            int fieldCount = reader.getFieldCount();
            System.out.println("===字段===");
            for (int i = 0; i < fieldCount; i++) {
                DBFField field = reader.getField(i);
                System.out.println(String.format("%s , %s , %s , %s" ,
                        field.getName() , field.getType() , field.getLength() , field.getDecimalCount()));
            }
            System.out.println("===数据===");
            int recordCount = reader.getRecordCount();
            for (int i = 0; i < recordCount; i++) {
                Object[] values = reader.nextRecord();
                System.out.println(Arrays.toString(values));
            }
        }
        System.out.println(String.format("文件 %s 已读取" , dbfFile.getAbsolutePath()));
    }

}

4.其它

(1)生成DBF文件下载;

(2)源码工程下载下载;

(3)另有一些DBF的解析组件不能仅局限于此,比如有的解析组件可以使用类型JDBC驱动的形式去连接访问等;

(4)DBF文件的查看方式也有读取有许多软件,本例中使用的插件软件下载;

 DBF文件的解析介绍欢迎来到陈冬冬的个人经验分享平台https://www.chendd.cn/blog/article/1677988503479967746.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/737170.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SIN65 DM蓝牙5.2双模热插拔PCB

键盘使用说明索引&#xff08;均为出厂默认值&#xff09; 软件支持&#xff08;驱动的详细使用帮助&#xff09;一些常见问题解答&#xff08;FAQ&#xff09;首次使用步骤蓝牙配对规则&#xff08;重要&#xff09;蓝牙和USB切换键盘默认层默认触发层0的FN键配置的功能默认功…

idea连接远程MySQL数据库

填写URL&#xff0c;以mysql为例 格式 jdbc:mysql://ip地址:端口号/数据库名 jdbc:mysql://127.0.0.1:3306/ldentification _Information

在 Kubernetes 上体验 EMQX 5.0 的 MQTT over QUIC 特性

引言 作为全球领先的开源分布式 MQTT Broker&#xff0c;EMQX 在 5.0 版本中引入了 MQTT over QUIC&#xff0c;将 MQTT 协议的优势与 QUIC 的特性相结合。通过充分利用 QUIC 协议低连接开销和多路复用的特点&#xff0c;MQTT over QUIC 为弱网络环境和不规则网络中的用户提供…

lib/db 标准单元分类(Standard Cells in ASIC Design)、Track定义

文章目录 drain curruntThreshold Voltage (VTH)channel lengthtrack&#xff08;Classification according to the Density&#xff09;Standard Cell Layout drain currunt Drain current (Id) uCox(W/L)[(Vgs-Vth)Vds-(1/2)Vds^2] Coxepision/tox#饱和电流计算公式&#xf…

C#上位机开发广阔前景

作为一名C#上位机开发人员&#xff0c;我可以告诉你&#xff0c;C#是一门广泛使用的编程语言&#xff0c;在软件开发领域有很多机会和前途。以下是一些关于C#上位机开发的理由&#xff1a; 广泛应用&#xff1a;C#是微软的主要开发语言之一&#xff0c;被广泛用于开发各种类型…

Linux 性能优化(网络、磁盘、内存、日志监控)

文章目录 1、CPU性能监控1.2、平均负载基础1.3、平均负载与 CPU 使用率1.4、监控命令top命令mpstat命令pidstat场景一&#xff1a;CPU 密集型进程场景二&#xff1a;I/O 密集型进程场景三&#xff1a;大量进程的场景1.5、CPU上下文切换1.6、 遇到CPU利用率高该如何排查1.7、根据…

【java】获取前一天日期

//获取前一天日期//写法一LocalDate yesterday2 LocalDate.now().minusDays(1);System.out.println(yesterday2);//写法二LocalDate yes1 LocalDate.now().plusDays(-1);System.out.println(yes1);//输入当前日期的年 月 日System.out.println(LocalDate.now().getYear());…

Redis 的 LRU 与 LFU 算法实现

一、前言 原文地址 Redis是一款基于内存的高性能NoSQL数据库&#xff0c;数据都缓存在内存里&#xff0c; 这使得Redis可以每秒轻松地处理数万的读写请求。 相对于磁盘的容量&#xff0c;内存的空间一般都是有限的&#xff0c;为了避免Redis耗尽宿主机的内存空间&#xff0c;R…

【高通WLAN】WLAN bdf如何配置支持UMC设备和TSMC设备

除了用于台积电(TSMC)设备的现有bdf文件外,软件升级中还包括新的WLAN bdf文件,以支持UMC设备。 bdf文件导入的路径是 wlan_proc\wlan\halphy_tools\host\bdfUtil\qca61x0\bdf ■ TSMC(现有):bdwlan.xxx至bdwlan.bin ■ UMC(新):bdwlanu.xxx至bdwlanu.bin 以上配置…

可以带着游泳的耳机有哪些,推荐几款可以在水下使用的游泳耳机

在夏天里游泳是一件相当舒适的运动项目&#xff0c;比起汗流浃背的健身房&#xff0c;游泳池已经成为了更多人所倾向的地方&#xff0c;因为它不仅可以起到塑性的效果&#xff0c;而且还能够让自己时长保持在舒爽的状态&#xff0c;这时就会有朋友在问&#xff0c;游泳的时候节…

IDEA介绍

集成开发环境&#xff08;IDE&#xff09;简介 集成开发环境&#xff08;IDE&#xff0c;Integrated Development Environment&#xff09;是为程序开发提供便利的应用程序。通常包括代码编辑器、编译器、调试器和图形用户界面等工具。它们集成了代码编写、分析、编译、调试等…

时间序列预测 | Matlab鲸鱼算法(WOA)优化极限梯度提升树XGBoost时间序列预测,WOA-XGBoost时间序列预测模型,单列数据输入模型

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 鲸鱼算法(WOA)优化极限梯度提升树XGBoost时间序列预测,WOA-XGBoost时间序列预测模型,单列数据输入模型 评价指标包括:MAE、RMSE和R2等,代码质量极高,方便学习和替换数据。要求2018版本及以上。 部分源码 %% …

基于单片机停车场刷卡收费的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;以51单片机作为主控系统&#xff1b;通过液晶显示当前时间&#xff0c;车位、剩余车位、时间等信息&#xff1b;进电机正反转表示开关门&#xff1b;按键可以设置当前时间/单价/分钟&#xff1b;RC522射频卡识别&#xff0c;当刷卡…

Qt Core学习日记——第二天QMetaClassInfo

QMetaClassInfo是QMetaObject中用于存放类信息的数据结构 QMetaClassInfo定义&#xff1a; class Q_CORE_EXPORT QMetaClassInfo { public: Q_DECL_CONSTEXPR inline QMetaClassInfo() : mobj(nullptr), handle(0) {} const char *name() const; const char *value() co…

使用Jetpack Compose中的Pager构建滑动页面

Jetpack Compose是Google为Android开发者提供的一种现代化的UI工具包&#xff0c;它采用声明式UI范式&#xff0c;使得开发者能够更加简洁、直观地构建用户界面。在这篇博客中&#xff0c;我们将探讨如何使用Jetpack Compose中的Pager构建滑动页面。 什么是Pager&#xff1f; …

如何查看Linux是否开启了数据包转发功能

如果Linux主机有多块网卡&#xff0c;如果不开启数据包转发功能&#xff0c;则这些网卡之间是无法互通的。 如何开启数据包转发功能&#xff1a; echo 1 > /proc/sys/net/ipv4/ip_forward sysctl -w net.ipv4.ip_forward1 如何查看是否开启了数据包转发功能&#xff1a; …

Some Strategies for Reducing Write Amplification in LSM-tree

写放大原理 (6 封私信) 如何理解SSD的写放大? - 知乎 (zhihu.com) 日志结构化合并树(LSM 树) LSM 树: 与应用就地更新的传统

直播预约|漫漫用户增长之路,如何快人一手

【导读】 如何实现用户增长及提升用户活跃度是各大开发者关注的重点之一&#xff0c;日常运营过程中&#xff0c;消息推送作为一个触达用户的有效手段&#xff0c;通过恰当的时机和智能的投放模式&#xff0c;可以有效提升消息的曝光度并吸引用户点击&#xff0c;从而实现用户…

​DMBOK知识梳理for CDGA/CDGP——第十章 参考数据与主数据(附常考知识点)

第十章 参考数据与主数据 第十章在CDGA分值占比不高&#xff0c;CDGP分值占比较高&#xff0c;主要考点包括&#xff1a;定义、目标、原则、参考数据及主数据管理好处、异同点、哪些属于主数据、活动、工具、度量指标等基本概念。因此本章建议充分理解参考数据及主数据的基础概…

开放式耳机品牌推荐,热门开放式耳机大盘点!

随着生活的提升&#xff0c;越来越多小伙伴开始使用开放式耳机了&#xff0c;因为开放式耳机不入耳不伤耳的设计&#xff0c;佩戴稳固又舒适&#xff0c;还具有良好的音质和舒适的佩戴体验。下面我来给大家安利几款很不错的开放式耳机&#xff0c;来看看有哪些吧。 一、NANK南…