工作中遇到這樣的一個需求,按位置解析一些文本文件,它們由頭部、詳情、尾部組成,並且每一行的長度可能不一樣,每一行代表的意思也可能不一樣,但是每一行各個位置代表的含義已經確定了。
例如有下面這樣一段文本:
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界面很丑。
相關鏈接
查看源代碼 點擊這里
代碼結構: