gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 10:50:42 24 4
gpt4 key购买 nike

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

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

01 TEST-REC.
05 VAR1 PIC X(02).
05 VAR2 OCCURS 2.
10 VAR3 PIC X(3).
05 VAR6 PIC X(02).

那么输出应该是(忽略输入的第一行):

05 VAR1 PIC X(02).
10 VAR3 PIC X(3).
10 VAR3 PIC X(3).
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);

}

}

我无法处理嵌套的 OCCURS 子句。假设我的输入如下所示:

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

嵌套 OCCURS 的数量没有限制。我没有找到处理嵌套 OCCURS 的方法。

谁能建议一种处理这种情况的方法?

最佳答案

试试这个

第 1 步. 制作树结构。 每行都有一个父级。 父级别 (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).

第 2 步。将结构写入流。 (a) 如果该行包含PIC 则写自己的行。 (b) 递归地写出每个 child 。 (如果该行包含 OCCURS N,则重复 N 次。)

public class Test {

static class Node {

final int level;
final String line;
final List<Node> children = new ArrayList<>();

Node(int level, String line) {
this.level = level;
this.line = line;
}

void write(PrintStream out) {
int n = 1;
if (line.contains("OCCURS"))
n = Integer.parseInt(line.replaceAll("^.* |[^\\d]*$", ""));
if (line.contains("PIC"))
out.println(line);
for (int i = 0; i < n; ++i)
for (Node child : children)
child.write(out);
}

}

static Node parse(String inputFile) throws IOException {
try (BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(inputFile)))) {
List<Node> lines = new ArrayList<>();
String line;
int no = 0;
while ((line = reader.readLine()) != null) {
++no;
line = line.trim();
int level = Integer.parseInt(line.replaceFirst("\\s.*", ""));
Node child = new Node(level, line);
if (lines.size() > 0) {
boolean found = false;
for (int i = lines.size() - 1; i >= 0; --i) {
Node parent = lines.get(i);
if (parent.level < level) {
parent.children.add(child);
found = true;
break;
}
}
if (!found)
throw new RuntimeException(
"parent not found for line " + no + " : " + line);
}
lines.add(child);
}
return lines.get(0);
}
}

public static void main(String[] args) throws IOException {
// Step 1
Node top = parse("C:\\Users\\DadMadhR\\Desktop\\temp\\copybook\\test_Copybook.cpy");
// Step 2
top.write(System.out);
}

}

关于java - 使用java扩展基于OCCURS子句的COBOL copybook,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34987477/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com