Java按位置解析文本文件(使用Swing選擇文件)


工作中遇到這樣的一個需求,按位置解析一些文本文件,它們由頭部、詳情、尾部組成,並且每一行的長度可能不一樣,每一行代表的意思也可能不一樣,但是每一行各個位置代表的含義已經確定了。
例如有下面這樣一段文本:

H1201504280222
D1000001TYPE12000000000002
D20001DATA13
T10334

每一行的前兩位決定了這一行各個位置代表的含義,例如以H1開關的第3位到第10位代表日期,盡管可以按照文檔一行一行的對照來了解它們的含義,但這樣不是一種折磨?經過一個小工具處理后,輸出HTML文件,用瀏覽器打開后,展示如下:

是不是看着稍微舒服些了呢?

要實現的幾個功能

  1. 可通過下拉框選擇不同類型的文件
  2. 使用Swing選擇文件再進行處理
  3. 易於擴展(可通過配置文件添加新的文件類型,而不需要更改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方法)

存在的問題

  1. 不適合解析大文件,由於是生成html文件,如果瀏覽器打開超過10M的文件會相當卡。
  2. 原生的Swing界面很丑。

相關鏈接

查看源代碼 點擊這里

代碼結構:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM