15 EXTR-SITE PIC X.
05 EXTR-DBA PIC X.
TE0305* 05 EXTR-BRANCH PIC X(05).
TE0305* 05 EXTR-NUMBER PIC X(06).
TE0305 05 FILLER PIC X(11).
CW0104 10 EXTR-TEXT6 PIC X(67).
CW0104 10 EXTR-TEXT7 PIC X(67).
CW0104* 05 FILLER PIC X(567).
Я думаю, вам нужно больше узнать о COBOL, прежде чем подходить к этой задаче.
Столбцы 1-6 могут содержать порядковый номер, могут быть пустыми или содержать что угодно. Если вы пытаетесь разобрать код COBOL, вам нужно игнорировать столбцы 1-6.
Столбец 7 называется областью индикатора. Он может быть пустым или содержать *
, который указывает комментарий, или -
, который указывает, что строка является продолжением предыдущей строки без пробелов/без комментариев или содержит D
, которая указывает, что это строка отладки.
Столбцы 73-80 могут содержать другой порядковый номер или пробел или что-либо еще и должны быть проигнорированы.
Если ваш источник COBOL был «свободным форматом», все будет немного по-другому, но это не так.
Нет смысла извлекать данные из строк комментариев, поэтому ожидаемый результат недействителен. Также неясно, где вы получаете линию тире в ожидаемом выходе.
Если вы пытаетесь разобрать источник COBOL, у вас должен быть действительный источник COBOL. Это не является действительным:
TE0305 05 FILLER PIC X(11).
CW0104 10 EXTR-TEXT6 PIC X(67).
CW0104 10 EXTR-TEXT7 PIC X(67).
Уровень-число (05) представляет собой группу элемент, если за ней следует более высокого уровня числами (два 10S). Группа не может иметь PICture.
PIC сам также может быть написан полностью, как ИЗОБРАЖЕНИЕ.
PIC может легко отображаться в идентификаторе/имени-данных (EPIC-CODE). Как и ИЗОБРАЖЕНИЕ, теоретически.
PIC и PICTURE могут отображаться в строке комментариев, даже если не прокомментированная строка кода.
Недостаток метода, который вы хотите использовать для поиска «описания» (который является идентификатором или именем данных).
01 the-record.
05 fixed-part-of-record.
10 an-individual-item PIC X.
10 another-item COMP-1.
10 and-another COMP-3 PIC 9(3).
10 PIC X.
05 variable-part-of-record.
10 entry-name OCCURS 10 TIMES.
15 entry-name-client-first-name
PIC X(30).
15 entry-name-client-surname
PIC X(30).
Это всего лишь короткий пример, чтобы не считаться всеобъемлющим.
От того, что ваш метод будет получить
an-individual-item
COMP-3
and two lines of "whatever happens when PIC is the first thing on line"
Чтобы сохранить это становится хамелеона вопрос, вам нужно задать новый вопрос (или разбирайтесь сами) с другим методом.
В зависимости от источника источника COBOL существуют лучшие способы борьбы с этим. Если источником является COBOL для IBM Mainframe, источником для вашего источника должен быть либо компиляционный список, либо SYSADATA из компиляции.
Из любого из них вы получите идентификатор/имя-имя в определенном месте в определенном состоянии. Никакой разборки вообще не нужно.
Если вы не можете это получить, я предлагаю вам найти номер уровня и найти первое, что после этого. У вас все еще будет некоторая работа.
Номера уровней могут быть одной или двумя цифрами в диапазоне 1-49, плюс 66, 77, 88. Некоторые компиляторы также имеют 78. Если ваш экстракт - это только «записи» (скорее всего), вы не увидите 77 или 78. Вероятнее всего, вы не увидите 66 (только видели, как он использовался один раз), и, вероятно, он увидит 88s, которые вы можете или не хотите включать в свой вывод (в зависимости от того, для чего вам это нужно).
1.
01.
01 FILLER.
01 data-name-name-1.
01 data-name-name-2 PIC X(80).
5.
05.
05 FILLER.
05 FILLER PIC X.
05 data-name-name-3.
05 data-name-name-4 PIC X.
Использование одной цифры для уровня-числа, а не написание FILLER явно довольно «новый» (от 1985 Standard), и это вполне возможно, у вас нет какой-либо из них. Но ты можешь.
Выход из вышеизложенного следует:
FILLER
FILLER
FILLER
data-name-name-1
data-name-name-2
FILLER
FILLER
FILLER
FILLER
data-name-name-3
data-name-name-4
Я понятия не имею, что вы хотите сделать с этим выходом. Без контекста это не имеет большого значения.
Возможно, ваш выбранный метод будет работать с вашими фактическими данными (при условии, что вы выбрали образец, и то, что вы получаете, является действительным кодом).
Однако было бы проще сказать «если первое слово в строке одно или двухзначное числовое, если есть второе слово, это то, что мы хотим, иначе используйте FILLER». Отмечая, конечно, предыдущие комментарии о том, что вы должны игнорировать.
Если ваш источник не содержит 88 уровней. Поскольку для целого ряда значений потребуется вторая строка, и если значения будут числовыми и одной или двумя цифрами, то это тоже не сработает.
Итак, укажите источник вашего источника. Если это мэйнфрейм IBM, попытайтесь получить результат из компиляции. Тогда ваша задача очень проста и на 100% точна.
Если вы не можете это получить, ознакомьтесь с этими данными. Если у вас действительно простые структуры, чтобы ваш метод работал, выполнение его с номера уровня все равно будет проще.
Если вам нужно вернуться к этому вопросу, задайте новый вопрос. В противном случае вы болтаете, чтобы высушить людей, которые уже провели свое время добровольно, отвечая на ваш существующий вопрос.
попробуйте использовать функцию String.split –
Просто добавьте предупреждения. Если вы пытаетесь разобрать COBOL, будьте осторожны с 'PIC' как псевдоним' PICTURE' и смотрите имена полей, которые могут содержать PIC в любом месте имени. Может быть, беспокоиться также о том, чтобы вырезать строки комментариев, '*' в столбце 7 (или 1 для некоторых компиляторов произвольной формы, но поддержка этого расширения может привести к неоднозначному разбору кода, поэтому boo hiss при его использовании) и очень рекомендуется '* > ', пропустите до конца маркеров комментария строки. –
Чтобы добавить к предупреждениям Брайана: нет требования, чтобы имя элемента находилось на той же строке, что и PIC/PICTURE; нет требования, чтобы элемент имел PIC/PICTURE; нет требования, чтобы элемент имел имя; нет требования, чтобы имя было данными непосредственно перед PIC/PICTURE. Образец, который вы показываете, даже не компилируется, 'FILLER' после EXTR-NUMBER не должен иметь PIC/PICTURE. –