解析来自 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
我必须像这样解析文本:
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