2014-10-13 7 views
2

Моя проблема в том, что с учетом переменной, которую я прочитал из файла, посмотрите, содержит ли она или соответствует другой строке.Найти подстроку в строке в COBOL

Другими словами, найти в файле все записи, в которых переменная

Bradd PIC X (30)

спички или содержит строку, введенную с клавиатуры.

Я очень уверен, что эта проблема будет решена с помощью инструкции инспектировать, и я пытался что-то вроде этого в моем коде:

  READ BRANCHFILE NEXT RECORD 
      AT END SET EndOfFile TO TRUE 
      END-READ. 
      PERFORM UNTIL EndOfFile 
       INSPECT BBRADD 
       TALLYING CONT for CHARACTERS 
        BEFORE INITIAL CITY 
       IF CONT>1 
        DISPLAY " BRANCH CODE :" BBRID 
        DISPLAY " BRANCH NAME :" BBRNAME 
        DISPLAY " BRANCH ADDRESS :" BBRADD 
        DISPLAY " PHONE   :" BBRPH 
        DISPLAY " E-MAIL   :" BEMAIL 
        DISPLAY " MANAGER NAME :" BMGRNAME 
        DISPLAY " ------------------" 
        DISPLAY " ------------------" 
       END-IF 
       READ BRANCHFILE NEXT RECORD 
        AT END SET EndOfFile TO TRUE 
       END-READ 
       MOVE 0 TO CONT 
      END-PERFORM. 

Где ГОРОД переменная I ввести с клавиатуры.

¿Кто-нибудь знает, как найти «подстроку» в «строке»?

Например, если я представил «Zaragoza», моя программа должна будет распечатать все записи в файле, в котором переменная BBRADD содержит «Zaragoza».

01 BRANCHREC. 
    88 EndOfFile VALUE HIGH-VALUE. 
    02 BBRID PIC X(6). 
    02 BBRNAME PIC X(15). 
    02 BBRADD PIC X(30). 
    02 BBRPH PIC X(10). 
    02 BEMAIL PIC X(20). 
    02 BMGRNAME PIC X(25). 
+0

Я пробую ваш предлагаемый код. Я должен сначала найти, как реализовать код для вычисления длины переменной CITY, поэтому я на ней. – daniegarcia254

+0

Не волнуйся об этом пока. Hardcode: длина, чтобы увидеть, получает ли она то, что вы хотите (она будет), а затем пойдет на поиск длины. Вначале нечего делать, если вы обнаружите, что это не годится для того, что вы хотите, поэтому всегда проверяйте код для того, что вы хотите первым :-) –

+0

Приятно слышать. Если у вас есть проблемы с длиной города, вам не нужно много чего использовать, используйте «FUNCTION REVERSE ...» и «INSPECT ... TALLYING ... FOR LEADING SPACE». Есть менее напряженные способы, но это распространено. Если у вас есть проблемы, задайте другой вопрос. Удачи. –

ответ

2

Вам необходимо установить CONT до нуля до INSPECT, каждый раз.

CONT только что обновляется от его начального значения при запуске INSPECT. После того, как вы найдете свой первый, каждая запись будет выглядеть так, как будто в ней есть CITY.

Если вначале кажется странным, что он работает именно так, но если бы это было не так, вы были бы ограничены случаями, когда именно так вы хотите, чтобы он работал.

А, глядя немного ближе, вы устанавливаете CONT в начальное значение, вы просто делаете это в неожиданном месте. Если он должен быть равен нулю, установите его на ноль сразу перед тем, как он будет равен нулю. Намного легче найти, менее легко для кого-то, изменяющего программу в будущем, чтобы сделать беспорядок.

Однако у вас есть еще одна проблема. Скажем, CITY - это PIC X (20). Пользователь вводит SEVILLA, и ваш INSPECT теперь будет искать SEVILLA, а затем 13 пробелов. В идеале вы хотели бы, чтобы SEVILLA сопровождалось одним пространством.

Вы должны быть в состоянии проверить значение, введенное пользователем, с завершающим пробелом, но не более.

Текущий популярный способ сделать это с помощью ссылки-модификации.

Вам необходимо ввести свой пользовательский ввод, узнать, сколько его пробелов содержит, рассчитать, сколько данных осталось, добавить один для завершающего пробела и сохранить это значение в поле (предпочтительно поле BINARY).

Тогда ваш ПРОВЕРЬТЕ может выглядеть следующим образом:

  INSPECT BBRADD 
      TALLYING CONT for CHARACTERS 
       BEFORE INITIAL CITY (1 : length-of-data-plus-one) 

Однако, то у вас есть проблема, если SEVILLA на самом деле в начала поля.

Таким образом, вы делаете небольшое изменение, а не подсчитываете символы, которые появляются перед ним, но подсчитываете его.

  INSPECT BBRADD 
      TALLYING CONT for ALL 
          CITY (1 : length-of-data-plus-one) 

Многие люди вместо этого кодируют цикл PERFORM с эталонной модификацией и выполняют тест таким образом. С окончательной версией INSPECT выше нужно закодировать логику завершения самостоятельно. Для учебных целей было бы хорошо сделать это в обоих направлениях.

При выполнении файла-io всегда используйте и проверяйте СОСТОЯНИЕ ФАЙЛА. Поместите свой READ в абзац и выполните его, вам не нужны два разных кода. Если вы используете FILE STATUS, вам не нужен AT END (или END-READ), так как поле, которое вы используете для получения значения FILE STATUS, будет «10» для конца файла. Просто используйте свои 88 в этом поле со значением «10».

Редактировать на ваш вопрос теперь указывает, где находится существующий 88-уровневый.

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

С другой стороны, это не «переносное» решение: если вы используете другие COBOL, вы можете обнаружить, что как только конец файла будет достигнут, он более недействителен для доступа к данным под номером FD. В стандарте, что происходит в этой ситуации, не определено, поэтому вы получаете различия между компиляторами.

Вы можете сохранить 88 на групповом элементе, имея его портативный, используя READ ... INTO ... и имея свой формат записи в WORKING-STORAGE. Это займет немного больше времени, так как данные должны быть перенесены из одного места в другое.

Я предпочитаю 88 в поле FILE STATUS и упрощаю READ, удаляя AT END и END-READ. Я уже не могу получить доступ к области записи под FD, поэтому я не могу случайно получить неправильные значения, которые выглядят хорошо.

+0

Хорошо, я уже пробовал, и он отлично работает. Код распознает подстроку, содержащуюся в строке. Спасибо, друг! – daniegarcia254