解析来自 Java 的 Cobol 字段描述

Parsing Cobol fields description from Java

我必须像这样解析文本:

 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).       

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

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

如果您要创建的东西可以采用任何抄写本并允许您 read/write java 中的结构,那么就需要像 IBM 的 DFDL 或类似的工具。

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

Cobol 图片子句的递归下降解析器很容易编写,但如果您只做一个单一用途的事情,它可能会过大。

真的,要给出任何类型的答案,都需要有关您要完成的任务的更多详细信息。

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

如果您在 cb2xml 项目中使用 cb2xml.jar 和 cb2xml_jaxb.jar, 您可以使用以下方法解析 java 中的 Cobol copybook:

        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