2015-02-27 1 views
1

У меня есть два файла FILE1 & FILE2, и пусть обе фиксированные длины 30 символов. Мне нужно найти записи из FILE1 & FILE2, которые содержат строку «COBOL», где позиция этого ключевого слова неизвестна и изменяется для каждой записи. Чтобы быть более понятным ниже, это образец макета.Найти совпадающие и непревзойденные записи и положение ключевого слова неизвестно

FILE1:

NVWGNLVKAKOIVCOBOLLKASVOIWSNVS   
SOSIVSNAVIS7780HLSVHSKSCOBOL56   
ZXCVBNMASDFGHJJKKLIIUYYTRREEWQ   
1234567890COBOL1234556FCVHJJHH   
COBOL1231231231231231341234334 

FILE2:

123456789
COBOL1231231231231231341234334   
GYKCHYYIIHHFTIUIHGJUGTUHGFUYHG   

Может ли один объяснить мне, как сделать это с помощью SORT или JOINKEYS, а также с помощью программы COBOL. Мне нужны два выходных файла.

Выход FILE-OP1: (которые содержат все записи, содержащие COBOL ключ-слово из file1 & file2) NVWGNLVKAKOIVCOBOLLKASVOIWSNVS
SOSIVSNAVIS7780HLSVHSKSCOBOL56
1234567890COBOL1234556FCVHJJHH
COBOL1231231231231231341234334
COBOL1231231231231231341234334

Выходной файл-ОР2 (которые содержат только сопоставление записей с ключевым словом COBOL из файла1 & file2) COBOL1231231231231231341234334

+1

Что вы хотите делать с записями, когда найдете их? – lurker

+1

Покажите нам, что вы пробовали до сих пор. – cschneid

+1

Не зная, какой результат вы хотите, это невозможно. JOINKEYS является частью SORT, поэтому нет «или». Если вам не нужно каким-то образом сопоставить файлы (о которых вы не говорите), JOINKEYS не подходит для этой задачи. Логика такая же: COBOL или SORT. Файлы процессов, необходимые для производства. Реализация будет отличаться, но нам нужно то, что ожидается на выходе, и где вы застряли в этом. –

ответ

0

Пример, псевдо-codeish, Cobol:

Open File1 
Read File1 into The-Record 
Perform until End-Of-File 
    Perform varying II from 1 by 1 
    until II > length of The-Record 
    If The-Record (II:5) = 'COBOL' 
     Display "Found COBOL at position " II 
    End-If 
    End-Perform 
    Read File1 into The-Record 
End-perform 

Повторите file2 с той же программой указал на свой другой файл.

Поскольку это звучит домашнее задание-y, я оставил несколько небольших причуд, которые вам нужно будет исправить в этом коде, но вы должны увидеть, где он взорвался или не смог, и иметь возможность легко разрешить их.

Если вам нужно выполнить какое-либо сопоставление и сброс между двумя файлами, это другое животное, и вам нужно получить свои правила для этого. Вы пытаетесь сопоставить файлы с «COBOL», расположенными в одной и той же позиции или что-то еще? Какое поведение вы ожидаете?

+0

Спасибо Джо. Я столкнулся с этим вопросом в одном из моих интервью. Я пока не использовал JOINKEYS, и поэтому я хочу расширить свои знания, зная ответ и концепцию JOINKEYS. если вы можете поделиться любыми материалами по этому поводу, это будет более полезно для меня. –

+0

Вероятно, самый простой способ сделать подход «JOINKEYS» в программе Cobol: 1) Сортировка обоих файлов во временные файлы, сканирование для работы и добавление их в фиксированную позицию в записи вместе с исходным смещением. 2) Выполняют ли традиционные параллельные чтения два файла, чтобы удалить несогласованные записи и присоединить согласованные записи во втором проходе. Это неэффективно, но все равно будет SORT/JOINKEYS. –

+0

Почему вы считаете, что это неэффективно? Что было бы более эффективным способом сделать это? –

0

Для вашего FILE1, СОРТИРОВАТЬ его на всех входных данных, включая записи, которые содержат COBOL и добавление порядкового номера (вы показываете свой результат в исходной последовательности). Если могут быть дубликаты записей, SORT на указанном вами порядковом номере.

Аналогичные для FILE2.

SORT для каждой программы может быть автономной (DFSORT или SyncSORT) или в рамках программы COBOL.

Вы тогда «совпадают» файлы, здесь полезный бит псевдо-кода от Брюс Мартин: https://stackoverflow.com/a/22950005/1927206

Логически после матча, то вам необходимо SORT оба выхода на последовательным номером один, и после того, как которые удаляют порядковые номера.

Помните, что вам нужно знать только, есть ли COBOL в данных, если вы используете COBOL для первых двух SORTs, у вас есть множество способов найти слово COBOL (и помните, что вам нужно только знать, есть ли там , а не там, где он есть или сколько раз он может быть там): как показал Джо Зитцелбергер, вы можете использовать однобайтную ссылку-модификацию, но будьте осторожны, чтобы не выходить за пределы данных с помощью PERFORM VARYING (используйте параметр компилятора SSRANGE if вы не совсем поняли, что я имею в виду); вы можете использовать INSPECT; расшатывать; STRING; определить данные с помощью OCCURS, для длины пять и использовать индекс для однобайтовой таблицы; использовать ЗАКОНЫ В ЗАВИСИМОСТИ; делать это «байт за раз»; и т. д.

0

Это немного напоминает обработку номера в формате.

Вы можете использовать «SS» в DFSORT для поиска записей, содержащих cobol.

Шаг 1. прочитать оба infiles, производят один OUTFILE OP-1

INCLUDE COND=(1,30,SS,EQ,C'COBOL') 

Step2. создайте рабочий файл так же, как шаг 1. используя только файл 1. Шаг 3. создайте рабочий файл так же, как шаг 1. используя только файл 2.

Запустите joinkeys на этих двух, чтобы найти совпадения. ==> outfile OP-2

По существу эта стратегия служит для устранения нечетных строк из соединения.

+0

Какой смысл в шаге 1? Почему вы называете записи «строками», это путает ученика. Это простой JOINKEYS с INCLUDE COND =, который вы показали в наборах данных JNFnCNTL, и SORT в основной задаче. Похоже, OPs не заинтересованы. –

+0

Шаг 1 создает только первый файл, требуемый от конкатенации данных файлов. Никогда не рекомендуется брать на себя обязательство сочетать отдельные требования. Один из них может впоследствии измениться, и это затрудняет прослеживаемость. Я буду платить «записи» над «строками». -1 на меня за неспособность включить обязательный контент кода COBOL, но SORT был необязательным в этом случае. (исключить SORTED). – mckenzm

+0

Но вы можете получить оба выхода из JOINKEYS. Зачем вам нужен отдельный шаг? –