Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/382.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用java扩展基于OCCURS子句的COBOL copybook_Java_Recursion_Copybook - Fatal编程技术网

使用java扩展基于OCCURS子句的COBOL copybook

使用java扩展基于OCCURS子句的COBOL copybook,java,recursion,copybook,Java,Recursion,Copybook,我正在编写一个java程序,如果COBOL copybook包含OCCURS子句,我必须在其中展开它 OCCURS关键字旁边的数字定义OCCURS子句子行的重复。行的第一个数定义级别。一个事件可能有多个子元素。 假设输入copybook如下所示: 01 TEST-REC. 05 VAR1 PIC X(02). 05 VAR2 OCCURS 2. 10 VAR3 PIC X(3). 05 VAR6 PIC X(02). 01 TEST-REC. 05 VAR1 PIC X(02). 05

我正在编写一个java程序,如果COBOL copybook包含OCCURS子句,我必须在其中展开它

OCCURS关键字旁边的数字定义OCCURS子句子行的重复。行的第一个数定义级别。一个事件可能有多个子元素。 假设输入copybook如下所示:

01 TEST-REC.
05 VAR1 PIC X(02).
05 VAR2 OCCURS 2.
    10 VAR3 PIC X(3).
05 VAR6 PIC X(02).
01 TEST-REC.
05 VAR1 PIC X(02).
05 VAR2 OCCURS 2.
    10 VAR3 PIC X(3).
    10 VAR4 OCCURS 2.
        15 VAR5 PIC X(2).
05 VAR6 PIC X(02).
05 VAR1 PIC X(02).
10 VAR3 PIC X(3).
15 VAR5 PIC X(2).
15 VAR5 PIC X(2).
10 VAR3 PIC X(3).
15 VAR5 PIC X(2).
15 VAR5 PIC X(2).
05 VAR6 PIC X(02).
然后输出应为(忽略输入的第一行):

我已经编写了以下代码来处理这个问题,它工作得很好

public class Test{

    private static String copyBookExpansaion = "";
    private static BufferedReader br1 = null;

    public static void parseLine() throws IOException{
      String line;
      while((line = br1.readLine()) != null){
          if(line.indexOf(" OCCURS ") == -1){
              copyBookExpansaion = copyBookExpansaion + line.trim() + "\n";
          }
          else{
              String s[] = line.trim().replaceAll(" +"," ").split(" ");
              int size = Integer.parseInt(s[3].replaceAll("[^0-9]", ""));
              line  = br1.readLine();
              for(int i = 0; i < size;i++){
                    copyBookExpansaion = copyBookExpansaion + line.trim() + "\n";
              }
          }
      }
      return;
  }

  /**
   * @param args
   * @throws IOException 
   */
  public static void main(String[] args) throws IOException {
      // TODO Auto-generated method stub

      FileInputStream copyBook= new FileInputStream("C:\\Users\\DadMadhR\\Desktop\\temp\\copybook\\test_Copybook.cpy");
      br1 = new BufferedReader(new InputStreamReader(copyBook));
      br1.readLine();
      parseLine();
      System.out.println(copyBookExpansaion);

  }

}
然后输出应该如下所示:

01 TEST-REC.
05 VAR1 PIC X(02).
05 VAR2 OCCURS 2.
    10 VAR3 PIC X(3).
05 VAR6 PIC X(02).
01 TEST-REC.
05 VAR1 PIC X(02).
05 VAR2 OCCURS 2.
    10 VAR3 PIC X(3).
    10 VAR4 OCCURS 2.
        15 VAR5 PIC X(2).
05 VAR6 PIC X(02).
05 VAR1 PIC X(02).
10 VAR3 PIC X(3).
15 VAR5 PIC X(2).
15 VAR5 PIC X(2).
10 VAR3 PIC X(3).
15 VAR5 PIC X(2).
15 VAR5 PIC X(2).
05 VAR6 PIC X(02).
嵌套发生的次数没有限制。我没有找到处理嵌套事件的方法

有人能提出处理这个案件的方法吗?

试试这个

第一步。制作树形结构。 每行都有一个父行。 父级的级别(01,05,…)小于行的级别。 所以结构是

01 TEST-REC.
 |
 +--05 VAR1 PIC X(02).
 |
 +--05 VAR2 OCCURS 2.
 |   |
 |   +--10 VAR3 PIC X(3).
 |   |
 |   +--10 VAR4 OCCURS 2.
 |       |
 |       +--15 VAR5 PIC X(2).
 |
 +--05 VAR6 PIC X(02).
第二步。将结构写入流。 (a) 如果该行包含
PIC
,则写入self行。 (b) 递归地写每个孩子。 (如果该行包含
发生N次
,则重复N次。)

公共类测试{
静态类节点{
最终智力水平;
最后一根弦线;
最终列表子项=新的ArrayList();
节点(整数级,字符串行){
这个水平=水平;
this.line=line;
}
无效写入(打印流输出){
int n=1;
如果(第行包含(“发生”))
n=Integer.parseInt(line.replaceAll(“^.*.[^\\d]*$”,“);
如果(第行包含(“PIC”))
out.println(行);
对于(int i=0;i0){
布尔值=false;
对于(int i=lines.size()-1;i>=0;--i){
节点父节点=line.get(i);
如果(父级
如果您能够,那么如果您先以语法形式写出代码,那么编写代码可能是最简单的。嵌套应该自行处理。您还没有说明全部要求。从示例输出中,似乎要抑制所有组级别,输出所有叶级别,并重复叶(如果有)。请澄清。示例中给出的扩展输出不是有效的COBOL。1.15级别是prceeding变量的子级别,因此它应该是grouplevel。所以将var5的级别重命名为10。2.可以通过在变量名后面加上索引来避免重复变量名,例如VAR5-1、VAR5-2。非常感谢您的回复。它似乎起作用了。我将测试多个案例。您能在代码中添加一些注释吗?我很难理解,这对我帮助很大。谢谢:)