我必须解析这样的文字:
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).
解析此类内容的最佳方法是什么?是否有现有的库可以做到这一点?
答案 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