Синхронная сортировка, непарные записи File1 имеют пробелы для отсутствия записей в файле F2. Можем ли мы заменить пробелы этих конкретных столбцов на ZEROS?

СОРТИРОВАТЬ:

 JOINKEYS FILES=F1,FIELDS=(5,4,A,10,20,A)                  
 JOINKEYS FILES=F2,FIELDS=(1,4,A,6,20,A)                   
 REFORMAT FIELDS=(F1:10,20,9,1,5,4,30,1,31,10,F2:27,10)    
 JOIN UNPAIRED,F1                                          
 INREC BUILD=(1,36,C',',37,10,C',',27,10,SFF,SUB,37,10,SFF,
                 EDIT=(TTTTTT))        

ВЫВОД: * 2-я строка 4-й столбец - это пробелы, не связанные со 2-м файлом, должны быть автоматически равны 0.

 22680372            ,5102,         1,         1,000000
 22222222            ,5105,         2,          ,000002   

ВЫВОД должен быть: * 2-я строка 4-й столбец - 0 или 0000 с, как непарный из 2-го файла, должен быть 0 с автоматически.

 22680372            ,5102,         1,         1,000000
 22222222            ,5105,         2,         0,000002   

person Agent Mahone    schedule 20.11.2013    source источник


Ответы (1)


Вам нужно условие, которое означает IFTHEN. У вас не может быть IFTHEN и BUILD в одном и том же INREC, но вы можете иметь несколько IFTHEN, и BUILD может быть частью IFTHEN.

IFTHEN=(WHEN=INIT указывает что-то, что должно быть сделано для каждой записи (безусловно).

IFTHEN=(WHEN=(логическое-выражение будет выполнено только в том случае, если условие истинно.

Каждый оператор BUILD создает полную новую промежуточную запись (промежуточную между вводом и выводом). OVERLAY влияет только на данные в указанной позиции (при условии отсутствия расширения записи).

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

 JOINKEYS FILES=F1,FIELDS=(5,4,A,10,20,A)                  
 JOINKEYS FILES=F2,FIELDS=(1,4,A,6,20,A)                   
 REFORMAT FIELDS=(F1:10,20,9,1,5,4,30,1,31,10,F2:27,10)    
 JOIN UNPAIRED,F1                                          
 INREC IFTHEN=(WHEN=INIT,
                 BUILD=(1,36,
                        C',',
                        37,10,
                        C',',
                        27,10,SFF,
                         SUB,
                          37,10,SFF,
                         EDIT=(TTTTTT))),
       IFTHEN=(WHEN=(47,1,CH,EQ,C' '),
                OVERLAY=(46:C'0'))  

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

Хорошо, это решение было немного неуклюжим. Вы можете заменить INREC на это, которое показывает для этого типа данных альтернативу EDIT:

INREC IFTHEN=(WHEN=INIT, 
                BUILD=(1,36, 
                       C',', 
                       37,10,FS,TO=FS,LENGTH=10,
                       C',', 
                       27,10,FS, 
                        SUB, 
                         37,10,FS, 
                        TO=FS,LENGTH=8)) 

Это гораздо более естественно, так как пробел превращается в ноль с начальными пробелами вообще без условий и с использованием ссылок только на это поле в его позиции в записи REFORMAT.

person Bill Woodger    schedule 20.11.2013
comment
Спасибо, Билл, это сработало для меня, но первая цифра справа от столбца идет на 47, а не на 46, может быть последней, ЕСЛИ ТО условие работает после включения ,, поэтому он считает его за единицу, даже тогда он должен иметь 48 , его 47. 46 дает: только одна цифра 0 перед. большое спасибо. будет читать больше о ЕСЛИ ТО - person Agent Mahone; 20.11.2013