Чтение последовательного файла в коболе

Есть ли способ прочитать последовательный файл в коболе много раз? Например, вы достигли конца файла, а затем вернулись к началу файла?


person Grekoz    schedule 05.12.2011    source источник


Ответы (6)


Закройте файл, снова откройте его и перечитайте.

Мне интересно узнать, почему вы хотите это сделать?

person TrueDub    schedule 05.12.2011
comment
Привет, TrueDub, я ищу наличие строки в файле 1 из элементов в файле 2, но ключей нет. Спасибо за превосходный ответ. - person Grekoz; 06.12.2011
comment
Было бы проще прочитать файл в массив и просто искать его каждый раз? Это, безусловно, будет быстрее, но вы можете столкнуться с проблемами памяти, если это огромный файл. - person TrueDub; 06.12.2011
comment
В этом случае JOINKEYS из DFSORT очень помогает. Я настоятельно не рекомендую ваш подход, если ваше требование состоит ТОЛЬКО в поиске строки из файла1 со списком строк в файле2... - person Raja Reddy; 07.12.2011

Вы также можете прочитать файл внутри цикла или выполнить изменение. Как и в другом ответе, убедитесь, что вы закрываете файл каждый раз, когда доходите до конца, и снова открываете его.

person Bill Burgess    schedule 05.12.2011
comment
Привет, Билл, повторное открытие файла может достигать тысячи повторных открытий, что, по моему мнению, было бы слишком дорогостоящим и неэффективным. - person Grekoz; 14.12.2011

В этом случае JOINKEYS из DFSORT очень помогает. Я настоятельно не рекомендую ваш подход, если ваше требование состоит ТОЛЬКО в поиске строки из файла1 со списком строк в файле2.

person Raja Reddy    schedule 09.12.2011
comment
Привет, Раджа, ни Joinkeys, ни dfsort не помогут, так как нет ключей и нечего сортировать. Файл 1 - мусор, а файл 2 имеет одну строку в строке. Цель состоит в том, чтобы найти эту единственную строку в файле 1 для каждой строки из файла 2. Если эта определенная строка была найдена в файле 1, установите флажок для этой строки в файле 2, затем получите следующий элемент в следующей строке, затем найдите появление строки в файле 1 сверху. - person Grekoz; 14.12.2011
comment
Я понимаю... но все же попытайтесь включить, если вы чувствуете, что можете их использовать... Я чувствую, что вы подумали... продолжайте только с логикой вашей программы на коболе... Если вам все еще нужны какие-то предложения, напишите краткое требования с макетами файлов и lrecls.. можете попытаться решить... - person Raja Reddy; 18.12.2011

Альтернатива: сделайте копию файла 1 с помощью утилиты (или другой программы COBOL). Копия, файл 1a, имеет ОРГАНИЗАЦИЯ ОТНОСИТЕЛЬНО (возможно, VSAM RRDS). В вашей программе сканирования/сопоставления вы можете перейти к первой записи файла 1a с помощью инструкции START.

Точно так же вы можете создать индексированный последовательный файл 1a, где ключ — это просто произвольное возрастающее число, совпадающее с номером записи.

person David Gorsline    schedule 20.05.2012

Было бы просто глупо открывать, обрабатывать, закрывать, снова открывать, обрабатывать, снова закрывать любое количество раз, не говоря уже о 1000 раз. Это очень, очень много времени.

В программе Cobol вы сохраняете меньший файл в таблице и обрабатываете таблицу с большим файлом, как было предложено.

Однако вам не нужна программа. JOINKEYS предоставит решение.

У тебя нет ключа? О, дорогой, дорогой. Вы делаете один. Вы создаете один и тот же однобайтовый ключ с одинаковым значением для каждой записи в обоих файлах. Сделайте JOINKEYS на этом ключе. Укажите SORTED в JOINKEYS (и NOSEQCK, если у вас есть DFSORT). У вас есть «декартово» соединение. Используйте SS (совпадение подстроки), которое может относиться ко всей записи или к ее части. Ваш фактический требуемый результат неясен, и я не думаю, что вы собираетесь придумать это сейчас.

С DFSORT вы можете сделать это за один шаг. С SyncSort вы можете сделать это за один шаг, если ваша версия поддерживает файлы JNFnCMTL.

person Bill Woodger    schedule 01.02.2013

Вот мое решение

В файле 1 есть записи плюс ключ. В файле 2 есть записи, в которых ключ встречается много раз.

Я храню данные файла1 в массиве, это означает, что вы должны знать размер данных

Я сканирую файл2 до конца файла, если ключ в файле2 совпадает с ключом в массиве, затем выполняю ваши вычисления,

Пример Сохраните 1 2 3 4 в массиве из файла 1 до конца файла 1. Сканируйте файл 2, имеющий 1 1 4 4 2 3. Если 1 в файле 2 соответствует 1 в массиве, то вычислите Продолжайте, пока не достигнете конца файла 2.

Надеюсь, поможет

person Thabang    schedule 15.06.2018