从Java解析Cobol字段描述

时间:2015-11-11 10:46:29

标签: java parsing cobol fixed-width

我必须解析这样的文字:

 000001        01 ROUTINE_NAME.                                                     
 000002       *                                                                 
 000003           05 ROUTINE_NAME-INPUT.                                            
 000004       *----------------------------------------------------------------*
 000005       *  FIELD DESCRIPTION                            OBBLIGATORIO     *
 000006       *----------------------------------------------------------------*
 000007              10 ROUTINE_NAME-FIELD_NAME                 PIC X(005).       

解析此类内容的最佳方法是什么?是否有现有的库可以做到这一点?

2 个答案:

答案 0 :(得分:3)

有许多映射工具可以将Cobol副本转换为更容易在java中读取的内容,例如xml。如果您只需要一本字帖,那么到目前为止,最简单的方法是手工操作并使用bytearray。

如果您要创建的内容可以使用任何副本并允许您在java中读取/写入该结构,那么就需要使用IBM DFDL或类似工具。

如果要转换该副本所描述的文件,那么像Syncsort或Datastage这样的ETL工具可能是一个好主意。

Cobol图片子句的递归下降解析器很容易编写,但如果你只做一次使用就可能有点过分了。

真的,要提供任何答案,需要有关你想要完成的更多细节。

答案 1 :(得分:2)

如果你只想解析一个副本,看看java项目cb2xml,它将解析cobol副本并计算字段的字段位置/长度。该软件包实际上将Cobol副本转换为Xml,然后可以用多种语言进行解析。

如果在cb2xml项目中使用cb2xml.jar和cb2xml_jaxb.jar, 您可以使用以下代码解析Java中的Cobol副本:

        Copybook copybook = CobolParser.newParser()
                                .parseCobol(copybookName);

在java中打印内容:

        List<Item> items = copybook.getItem();
        for (Item item : items) {
            printItem("   ", item);
        }
    }

    public static void printItem(String indent, Item item) {
         System.out.println(indent + item.getLevel() + " " + item.getName() +"\t" + item.getPosition() 
                + "\t " + item.getStorageLength() + "\t" + item.getPicture());

        List<Item> items = item.getItem();           
        for (Item child : items) {
            printItem(indent + "   ", child);
        }
    }

如果您使用cb2xml将Cobol转换为Xml

000001    01 ROUTINE-NAME.                                              
000003       05 ROUTINE-NAME-INPUT.                                     
000007          10 ROUTINE-NAME-FIELD-NAME                 PIC X(005).  

转换为

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<copybook filename="xx.cbl">
    <item         display-length="5" level="01" name="ROUTINE-NAME"                                 position="1" storage-length="5">
        <item     display-length="5"   level="05" name="ROUTINE-NAME-INPUT"                         position="1" storage-length="5">
            <item display-length="5"     level="10" name="ROUTINE-NAME-FIELD-NAME" picture="X(005)" position="1" storage-length="5"/>
        </item>    
    </item>
</copybook>

披露:我参与了cb2xml的贡献者

还有其他项目(例如legstar)用于解析Cobol。另外Koopa Cobol Parser