Как удалить дубликаты из файла с помощью COBOL?

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

<manifest>
    ...
    <application>
        <!-- BroadcastReceiver that listens for incoming SMS messages -->
        <receiver android:name=".SmsReceiver"
            android:permission="android.permission.BROADCAST_SMS">
            <intent-filter>
                <action android:name="android.provider.Telephony.SMS_DELIVER" />
            </intent-filter>
        </receiver>

        <!-- BroadcastReceiver that listens for incoming MMS messages -->
        <receiver android:name=".MmsReceiver"
            android:permission="android.permission.BROADCAST_WAP_PUSH">
            <intent-filter>
                <action android:name="android.provider.Telephony.WAP_PUSH_DELIVER" />
                <data android:mimeType="application/vnd.wap.mms-message" />
            </intent-filter>
        </receiver>

        <!-- Activity that allows the user to send new SMS/MMS messages -->
        <activity android:name=".ComposeSmsActivity" >
            <intent-filter>
                <action android:name="android.intent.action.SEND" />                
                <action android:name="android.intent.action.SENDTO" />
                <category android:name="android.intent.category.DEFAULT" />
                <category android:name="android.intent.category.BROWSABLE" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </activity>

        <!-- Service that delivers messages from the phone "quick response" -->
        <service android:name=".HeadlessSmsSendService"
            android:permission="android.permission.SEND_RESPOND_VIA_MESSAGE"
            android:exported="true" >
            <intent-filter>
                <action android:name="android.intent.action.RESPOND_VIA_MESSAGE" />
                <category android:name="android.intent.category.DEFAULT" />
                <data android:scheme="sms" />
                <data android:scheme="smsto" />
                <data android:scheme="mms" />
                <data android:scheme="mmsto" />
            </intent-filter>
        </service>
    </application>
</manifest>

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

Если вы намереваетесь выполнять любое SMS-сообщение / MMS, вам также понадобятся соответствующие разрешения. Хотя система, по-видимому, не проверяет их при определении подходящих кандидатов приложений по умолчанию, для их соответствующих операций необходимы следующие разрешения:

<uses-permission android:name="android.permission.SEND_SMS" />
<uses-permission android:name="android.permission.RECEIVE_SMS" />
<uses-permission android:name="android.permission.READ_SMS" />
<uses-permission android:name="android.permission.WRITE_SMS" />
<uses-permission android:name="android.permission.RECEIVE_MMS" />

Если вам не хватает SEND_SMS, READ_SMS , или WRITE_SMS, когда вы пытаетесь выполнить данное действие, будет выбрано SecurityException. Однако, если вам не хватает разрешения RECEIVE_*, ваше приложение будет просто не доставлять соответствующие трансляции, и может показаться, что при тестировании этих функций ничего не происходит.

30
задан ChrisF 16 March 2013 в 11:45
поделиться

4 ответа

Наконец-то это сработало. Вот код

   IDENTIFICATION DIVISION.
   PROGRAM-ID.RemoveDup2.
   ENVIRONMENT DIVISION.
   INPUT-OUTPUT SECTION.
   FILE-CONTROL.
   SELECT INPUTFILEDUP ASSIGN TO 'C:\Cobol\INPUTFILEDUP.txt'
           ORGANIZATION IS LINE SEQUENTIAL.
   SELECT OUTFILEDUP ASSIGN TO 'C:\Cobol\OUTFILEDUP.txt'
               ORGANIZATION IS LINE SEQUENTIAL.
   SELECT WorkFile ASSIGN TO "WORK.TMP".

   DATA DIVISION.

   FILE SECTION.
   FD INPUTFILEDUP.
   01 INPUTFILEDUPREC.
       88 EOFINPUTFILEDUP    VALUE HIGH-VALUES.
       02 INPUTFILEID        PIC 9(07).

   FD  OUTFILEDUP.
   01 OUTFILEDUPREC         PIC 9(07).

   SD WorkFile.
   01 WORKREC.
      02 WINPUTFILEID       PIC 9(07).

   WORKING-STORAGE SECTION.
   77 WS-VARIABLE            PIC 9(09) VALUE ZERO.
   77 REC-NOT-MATCH          PIC 9(01).
   77 CUR-VARIABLE           PIC 9(7) VALUE ZERO.

   PROCEDURE DIVISION.
   BEGIN.
       SORT WorkFile ON ASCENDING KEY WINPUTFILEID
       USING INPUTFILEDUP GIVING INPUTFILEDUP

   OPEN INPUT  INPUTFILEDUP
   OPEN OUTPUT OUTFILEDUP

       READ INPUTFILEDUP
               AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
       PERFORM UNTIL (EOFINPUTFILEDUP)
           IF INPUTFILEID NOT EQUAL TO  WS-VARIABLE
                   MOVE  INPUTFILEID TO WS-VARIABLE
                   WRITE OUTFILEDUPREC  FROM  INPUTFILEID
                   READ  INPUTFILEDUP
                       AT END SET  EOFINPUTFILEDUP TO TRUE
       PERFORM UNTIL (EOFINPUTFILEDUP)
           ELSE
                   DISPLAY "DUPLICATE FOUND    "   INPUTFILEID

   READ INPUTFILEDUP
               AT END SET EOFINPUTFILEDUP  TO TRUE
   END-READ
   END-PERFORM

   CLOSE   INPUTFILEDUP
   CLOSE  OUTFILEDUP

   STOP RUN.
6
ответ дан 28 November 2019 в 00:30
поделиться

Если вы отсортируете файл с помощью внешней сортировки перед чтением его в коболе программы вы можете удалить дубликаты с ключевым словом SORT EQUALS. Если вы отсортируете файл до программы cobol и не удаляете дубликаты, то простой оператор IF и поле сохранения позволят вам удалить дубликаты.

Настройте поле INPUTFILEID-save. Сразу после чтения .... ЕСЛИ inputfileid равняется inputfileid-save читать снова, если не писать ... после записи переместите inputfileid в inputfileid-save. Для этого вам придется прервать текущий спектакль.

Если вы не совсем понимаете, о чем я говорю, и хотите помочь вам изменить код, просто дайте мне знать

1
ответ дан 28 November 2019 в 00:30
поделиться

sort является стандартным для этих заданий os-close, чтобы следовать принципу DRY, шестерни -t для разделителя и -u для уникальных. Это К.

1
ответ дан 28 November 2019 в 00:30
поделиться

Когда Организация имеет значение Последовательный , удаленная запись является последней прочитанной записью. Оператор Delete действителен только в том случае, если последняя операция с файлом является успешной оператором Read . В противном случае Delete возвращает значение File Status , равное 43. Поскольку Delete не может возвращать значения File Status , начинающиеся с 2, когда файл имеет вид Открыть с Последовательный доступ, кодирование Недействительный ключ в таком Удалить запрещено.

Когда Для файла выбран динамический или Произвольный доступ, параметр Удалить , как и Rewrite , становится немного менее ограничительным. Удаляемая запись не обязательно должна быть предварительно прочитана. Просто введите информацию о первичном ключе в описание записи для файла и выполните оператор Delete . Если запись не существует, возвращается 23 статус файла и существует условие Неверный ключ .

Со страницы 274 из

Sams научитесь COBOL за 24 часа

страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID , сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID после его первого появления, и Удалите соответственно (после того, как вы записали его в выходной файл).

Просто введите информацию о первичном ключе в описание записи для файла и выполните оператор Delete . Если запись не существует, возвращается 23 статус файла и существует условие Неверный ключ .

Со страницы 274 из

Самс научитесь COBOL за 24 часа

страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID , сделайте запись по мере того, как вы проходите вхождения данного INPUTFILEID после его первого появления, и Удалите соответственно (после того, как вы записали его в выходной файл).

Просто введите информацию о первичном ключе в описание записи для файла и выполните оператор Delete . Если запись не существует, возвращается 23 статус файла и существует условие Неверный ключ .

Со страницы 274 из

Самс научитесь COBOL за 24 часа

страница 274 (которую я только что стер с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID , сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID после его первого появления, и Удалите соответственно (после того, как вы записали его в выходной файл).

возвращается Статус файла из 23 и существует условие Неверный ключ .

Со страницы 274 из

Самс научитесь COBOL за 24 часа

, страница 274 (которая Я только что стер пыль с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID , сделайте запись по мере того, как вы проходите случаи появления данного INPUTFILEID после его первого появления, и Удалите соответственно (после того, как вы записали его в выходной файл).

возвращается Статус файла из 23 и существует условие Неверный ключ .

Со страницы 274 из

Самс научитесь COBOL за 24 часа

, страница 274 (которая Я только что стер пыль с моей книжной полки). Таким образом, в вашем случае вы, вероятно, настроите свои записи для сортировки по INPUTFILEID , сделайте запись по мере того, как вы проходите вхождения данного INPUTFILEID после его первого появления, и Удалите соответственно (после того, как вы записали его в выходной файл).

2
ответ дан 28 November 2019 в 00:30
поделиться
Другие вопросы по тегам:

Похожие вопросы: