Java按位置解析文本文件(使用Swing选择文件)
工作中遇到这样的一个需求,按位置解析一些文本文件,它们由头部、详情、尾部组成,并且每一行的长度可能不一样,每一行代表的意思也可能不一样,但是每一行各个位置代表的含义已经确定了。
例如有下面这样一段文本:
H1201504280222
D1000001TYPE12000000000002
D20001DATA13
T10334
每一行的前两位决定了这一行各个位置代表的含义,例如以H1开关的第3位到第10位代表日期,尽管可以按照文档一行一行的对照来了解它们的含义,但这样不是一种折磨?经过一个小工具处理后,输出HTML文件,用浏览器打开后,展示如下:
是不是看着稍微舒服些了呢?
要实现的几个功能
- 可通过下拉框选择不同类型的文件
- 使用Swing选择文件再进行处理
- 易于扩展(可通过配置文件添加新的文件类型,而不需要更改Java代码)
相关实现
运行截图如下:
1.首先读取配置,将能处理的文件类型显示在下拉框中
通过file_list_config.properties文件进行配置:
test=Test File
需要有test.properties文件来定义有哪些不同的行:
H1=folder/Header.xml
D1=folder/Detail1.xml
D2=folder/Detail2.xml
T1=folder/Trailer.xml
而Header.xml代表用来定义以H1开头的行:
<?xml version="1.0" encoding="UTF-8"?>
<bean>
<field length="2">Flag</field>
<field length="8">Date</field>
<field length="4">Type</field>
</bean>
由于swing可的下拉框JComboBox不直接支持HTML中的key value对,可以像下面这样初始化:
// initial JComboBox
private JComboBox<FileItem> jSelect = new JComboBox<FileItem>();
.........
// define FileItem
public class FileItem {
private String key;
private String value;
..........
@Override
public String toString() {
return value;
}
}
// 填充下拉框
fileList = ResourceFactory.getSington().getFileItemList();
for (FileItem item : fileList) {
jSelect.addItem(item);
}
下面代码中 getFileItemList 是通过读取配置文件,返回一个 List 的结果集, 由于在 JComboBox 中展示的文本它会调用FileItem的toString进行输出,所以需要重写toString方法。
2.选择要处理的文件后,点击按钮 Parse,根据文件名称对缓存对象中获取各行的字段规则:
private Map<String, Map<String, List<RecordField>>> CONFIG_CACHE = new HashMap<String, Map<String, List<RecordField>>>();
如何缓存没有该文本对应的规则,需解析对应的XML文件并放入缓存中。
3.一行一行解析文本,根据前两位按照不同的规则返回html字符串,最后输出到结果文件中:
writer.write(appendHeader());
String line;
while ((line = reader.readLine()) != null) {
if ("".equals(line.trim())) {
continue;
}
try {
String identify = line.substring(0, 2);
if (configCache.containsKey(identify)) {
fields = configCache.get(identify);
writer.write(buildOutputStr(line, fields));
} else {
writer.write("Skip Record : " + line + "<br /><br />");
}
} catch (Exception e) {
writer.write("Parse Error : " + line + "<br /><br />");
}
}
writer.write(appendFooter());
4.如果需要添加新的要处理文件类型,往file_list_config.properties文件中进行追加,编写各个字段解析规则即可。
导出可运行Jar包
eclipse自带这项功能,在项目中右键
Export -> 一直next -> 最后选择入口类(需要有main方法)
存在的问题
- 不适合解析大文件,由于是生成html文件,如果浏览器打开超过10M的文件会相当卡。
- 原生的Swing界面很丑。
相关链接
查看源代码 点击这里
代码结构:
Java按位置解析文本文件(使用Swing选择文件)的更多相关文章
- java 选择文件夹对话框
java swing 选择文件夹对话框 import java.io.File; import javax.swing.JFileChooser; public class Test2 { publi ...
- 2019年 Java 面试题解析
2019年 Java 面试题解析 转载地址:https://www.cnblogs.com/Zz-maker/p/11193930.html 作者: Zz_maker 包含的模块: 本文分为十九个模块 ...
- Swing实现文件选择(目录选择)附导出
具体生成工具如图: (1) (2) (3) (4) 源码 : example.java package org.qiailin.jframe; import java.awt.Container; i ...
- 十一:Java之GUI图形Awt和Swing
一. AWT和 Swing AWT 和 Swing 是 Java 设计 GUI用户界面的基础.与 AWT 的重量级组件不同,Swing 中大部分是轻量级组件.正是这个原因,Swing 差点儿无所不能, ...
- Java进阶篇(六)——Swing程序设计(上)
Swing是GUI(图形用户界面)开发工具包,内容有很多,这里会分块编写,但在进阶篇中只编写Swing中的基本要素,包括容器.组件和布局等,更深入的内容会在高级篇中出现.想深入学习的朋友们可查阅有关资 ...
- Java 面试知识点解析(二)——高并发编程篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(四)——版本特性篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(五)——网络协议篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
- Java 面试知识点解析(六)——数据库篇
前言: 在遨游了一番 Java Web 的世界之后,发现了自己的一些缺失,所以就着一篇深度好文:知名互联网公司校招 Java 开发岗面试知识点解析 ,来好好的对 Java 知识点进行复习和学习一番,大 ...
随机推荐
- [转] sql数据类型 varchar与nvarchar的区别
SQL Server提供两种数据类型来存储字符信息.在如何在SQL Server或应用程序中使用方面,这两种数据类型大致是一样的.差别在于nvarchar是用于存储处理数据库图表中多语言数据的Unic ...
- LVS概述
LVS原理概述: lvs是一个开源软件,是Linux virtual server的简写,即linux虚拟服务器,是一个虚拟的服务器集群系统,lvs集群采用ip负载均衡技术和基于内容的请求分发技术.将 ...
- 利用微软类库 Visual Studio International Pack 汉字转拼音
首先,从微软官网下载安装包:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=44CAC7F0-633B-477D-AED2 ...
- 多个UITableView横向切换的简单实现(有点类似网易新闻)
实现多列表切换,位置监控,置顶等功能. 方法一: 创建一个TableView,在切换的时候请求各类目需要的数据,然后刷新列表,通过动画模拟出滑动效果. #import <UIKit/UIKit. ...
- 规则引擎ILog和CKRule的对比
IBM™ WebSphere™ ILOG是业界最有影响力的业务规则商业软件,它提供了最好的业务规则管理系统,在Java领域更是有广泛的成功案例.网上关于ILOG的技术资料非常多,大家都比较了解ILOG ...
- CSS3的几个标签速记1
border-radius:CSS3圆角 语法:border-radius:25px; 椭圆边角:语法-border-radius:xx%;或者15px/100px; box-shadow ...
- ES6的promise的学习
1.Promise的含义: Promise是异步编程的一种解决方案,比传统的解决方案——回调函数和事件——更合理和更强大.它由社区最早提出和实现,ES6将其写进了语言标准,统一了用法,原生提供了Pro ...
- Java实战之03Spring-01Spring概述
一.Spring概述 1.Spring是什么? Spring是分层的Java SE/EE应用 full-stack轻量级开源框架,以IoC(Inverse Of Control:反转控制)和AOP(A ...
- 九度OJ 1497 面积最大的全1子矩阵 -- 动态规划
题目地址:http://ac.jobdu.com/problem.php?pid=1497 题目描述: 在一个M * N的矩阵中,所有的元素只有0和1,从这个矩阵中找出一个面积最大的全1子矩阵,所谓最 ...
- C++ GUI Qt4编写的文本编辑器
mainwindow.h: #ifndef MAINWINDOW_H #define MAINWINDOW_H #include <QMenu> #include <QAction& ...