Как импортировать разные наборы данных с разными переменными из одного и того же текстового файла в SAS - PullRequest
0 голосов
/ 18 декабря 2018

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

Первый символ каждого наблюдения говорит о том, на каком уровне значения в строке примерно равны (1 - о фирмах, 2 - о сотрудниках ...).Согласно схеме, каждый уровень имеет разные переменные различной длины.

Это небольшой пример данных, которые я должен импортировать.Первые 4 переменные одинаковы, но впоследствии у каждого уровня есть свои переменные с разными длинами.Переменная «тип» определяет, на каком уровне находится наблюдение.И все остальные переменные сгруппированы в «other»:

DATA WORK.test;
INFILE DATALINES;
INPUT
    type $ 1-1
    full_registry $ 2-2
type_update $ 3-3
cnpj $ 4-17
other $ 18-1200

;

DATALINES;
1F 000000000001911BANCO DO BRASIL SA     DIRECAO GERAL        022005110300                                                                                                                                                                 
2F 000000000001912MARCIO HAMILTON FERREIRA    000***923641**100000020101117                                                                                       
2F 000000000001912NILSON MARTINIANO MOREIRA   000***491386**100000020101117                                                                                                                          
2F 000000000001912WALTER MALIENI JUNIOR       000***718468**100000020101117                                                                                                                          
2F 000000000001912PAULO ROGERIO CAFFARELLI    000***415907**100000020120327                                                                                                                          
2F 000000000001912ADRIANO MEIRA RICCI         000***295868**100000020180412                                                                                                                          
2F 000000000001912MARCOS RENATO COLTRI        000***890627**100000020180418                                                                                                                           
2F 000000000001912CARLA NESI                  000***370266**100000020170614                                                                                                                           
6F 000000000001916499999                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
1F 000000000002722BANCO DO BRASIL SA     MANAUS (AM)          022005110300                                                                                                                        
1F 000000000003532BANCO DO BRASIL SA     SANTOS - SANTOS (SP) 022005110300                                                                                                                              
1F 000000000004342BANCO DO BRASIL SA     CAMPOS EST.UNIF.     022005110300                                                                                                                          
1F 000000000005152BANCO DO BRASIL SA     MACAPA-EST.UNIF.     022005110300                                                                                                                          
;;;;
run;

Как лучше всего читать этот файл?

Я думал одве возможности:

I.Прочитайте текст три раза с тремя макетами для каждого уровня.Выбросьте замечания, которые были прочитаны неправильно.Я не уверен, сработает ли это.

II.Прочитайте первые 4 переменных и поместите оставшуюся часть строки в строковую переменную, как я делал в этом примере.Затем используйте связку substr () для разделения нескольких переменных.Я не уверен, что это самый умный способ сделать это.

Мне не хватает гораздо более простого способа сделать это?

Я использую версию Enterprise 7.13.

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018
  1. Чтение первого символа
  2. Создание операторов ввода для каждого типа записи
  3. Используя ввод из # 1, используйте правильный оператор INPUT.
  4. Возможно, вы захотите добавить логику для хранения значений в строках, особенно если вы хотите сохранить информацию заголовка компании.
  5. Вы также можете подумать, хотите ли вы, чтобы все эти записи поступали в один и тот же набор данных или в три разных, которыми вы сможете управлять позже.

    data want;
    
    
    input @1 type @;
    if type = 'A' then 
        input .......;
    else if type='B' then 
         input ....;
    
    run;
    
0 голосов
/ 18 декабря 2018

Вы можете использовать одиночный трейлинг @ в конце оператора ввода для удержания текущей строки для дальнейших операторов ввода на том же шаге данных.Например,

DATA want;
INFILE DATALINES;
/*Always input the first 4 variables*/
INPUT type $ 1-1 full_registry $ 2-2 type_update $ 3-3 cnpj $ 4-17 @;
select(type);
when('1') input var1; /*fill this in with input rules for type 1 records*/
when('2') input var2; /*fill this in with input rules for type 2 records*/
otherwise input; /*do not input any other variables - just ignore the row*/
end;
DATALINES;
1F 000000000001911BANCO DO BRASIL SA     DIRECAO GERAL        022005110300                                                                                                                                                                 
2F 000000000001912MARCIO HAMILTON FERREIRA    000***923641**100000020101117                                                                                       
2F 000000000001912NILSON MARTINIANO MOREIRA   000***491386**100000020101117                                                                                                                          
2F 000000000001912WALTER MALIENI JUNIOR       000***718468**100000020101117                                                                                                                          
2F 000000000001912PAULO ROGERIO CAFFARELLI    000***415907**100000020120327                                                                                                                          
2F 000000000001912ADRIANO MEIRA RICCI         000***295868**100000020180412                                                                                                                          
2F 000000000001912MARCOS RENATO COLTRI        000***890627**100000020180418                                                                                                                           
2F 000000000001912CARLA NESI                  000***370266**100000020170614                                                                                                                           
6F 000000000001916499999                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
1F 000000000002722BANCO DO BRASIL SA     MANAUS (AM)          022005110300                                                                                                                        
1F 000000000003532BANCO DO BRASIL SA     SANTOS - SANTOS (SP) 022005110300                                                                                                                              
1F 000000000004342BANCO DO BRASIL SA     CAMPOS EST.UNIF.     022005110300                                                                                                                          
1F 000000000005152BANCO DO BRASIL SA     MACAPA-EST.UNIF.     022005110300                                                                                                                          
;;;;
run;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...