SAS импортирует txt-файл с использованием infile

Я ищу две процедуры для импорта двух файлов txt в SAS. Первый файл имеет фиксированную ширину. Второй текстовый файл - это файл с разделителями. Код SAS прилагается ниже:

  1. DATA filename;  
    INFILE "filelocation";  
    INPUT  
    VAR1 $1-11  
    VAR2 $13-16  
    @18 VAR3 MMDDYY10.   
    VAR4 $29-53;  
    
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    ;  
    RUN;  
    
  2. DATA filename;  
    INFILE "filelocation" DELIMITER="|" MISSOVER  
    DSD LRECL=32767;  
    INFORMAT VAR1 $11.;  
    INFORMAT VAR2 $4.;  
    INFORMAT VAR3 MMDDYY10.;  
    INFORMAT VAR4 $25.;  
    FORMAT VAR1 $11.;  
    FORMAT VAR2 $4.;  
    FORMAT VAR3 MMDDYY10.;  
    FORMAT VAR4 $25.;  
    INPUT  
    VAR1 $  
    VAR2 $  
    VAR3   
    VAR4 $  
    ;  
    RUN;  
    

Мои вопросы:
1. Почему «INPUT» находится в начале кода в первой процедуре, а в последней во второй процедуре? Имеет ли значение порядок ввода "INPUT"?

  1. В первой процедуре перед VAR3 стоит символ «@ 18», который представляет собой переменную, представляющую дату, и определяет, что VAR3 начинается с позиции 18. Могут ли все переменные использовать это выражение? бывший. @ 1 VAR1 $
    @ 13 VAR2 $
    @ 18 VAR3 MMDDYY10.
    @ 29 VAR4 $;

  2. В процедуре 2: INPUT VAR1 $
    VAR2 $
    VAR3
    VAR4 $
    почему у переменной нет номера после знака «$» для определения длины переменной?

Спасибо!


person mumu.W    schedule 05.01.2016    source источник
comment
Слишком много вопросов сразу. Пожалуйста, упростите свой вопрос до одного на сообщение.   -  person Reeza    schedule 05.01.2016
comment
Спасибо за предложение. Я сузил его до трех вопросов, и все они связаны. Надеюсь, это лучше понять.   -  person mumu.W    schedule 05.01.2016


Ответы (2)


Основное различие, о котором вы говорите, - это разница между данными, которые хранятся в ФИКСИРОВАННЫХ местах столбцов, и данными, которые РАЗЛИЧИНЫ. Поскольку в вашем первом примере используются данные с фиксированным расположением столбцов, вы можете использовать диапазоны столбцов (1-11) для чтения данных. С данными с разделителями вы не можете указать фиксированные столбцы (или даже фиксированные длины для чтения), поскольку вы не знаете, сколько символов находится между разделителями. Вместо этого вы должны использовать ввод в режиме списка, и SAS будет читать значение до следующего разделителя.

Давайте разберемся с подробными вопросами.

  1. Почему? Потому что так была написана программа. Существует большая гибкость в написании кода SAS.

При построении набора данных важно понимать, как порядок операторов может повлиять на результат. SAS попытается определить определение переменных, которые вы используете, как можно скорее. Таким образом, если вы поместите оператор FORMAT перед оператором INPUT, это может повлиять как на тип переменной, создаваемой SAS, так и на порядок, в котором они создаются на этапе данных.

  1. Нет, это НЕ то же самое.

Когда вы просите его прочитать VAR1 $ 1-11, вы просите его прочитать все, что находится в столбцах с 1 по 11, включая любые встроенные пробелы. Он также знает, что вы хотите, чтобы VAR1 был определен как символ (поскольку вы использовали $), и в нем должно быть место для 11 байтов. Когда вы попросите его прочитать @1 VAR1 $, он прочитает следующее слово, которое он увидит, начиная с столбца 1. Он остановится на первом пустом месте. Таким образом, он может читать столбцы с 1 по 5 или он может читать столбцы с 70 по 77, если столбцы с 1 по 69 пусты. Это также приведет к тому, что VAR1 будет иметь длину только 8 (если вы не определили ее ранее), поскольку это значение по умолчанию для символьных переменных, когда SAS не может сказать, что вы хотите другую длину.

Причина, по которой исходная программа использовала @18 VAR3 MMDDYY10., заключается в том, что вам нужно указать информацию, чтобы SAS правильно преобразовал текст в данных в число, которое SAS использует для представления этой даты, и вы не можете сделать это с диапазоном столбцов.

  1. Длина не нужна. Вам даже не нужен $, поскольку вы уже определили тип переменной.

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

person Tom    schedule 06.01.2016
comment
Спасибо, Том! Ваши ответы очень информативны и разъяснили мои затруднения. Я ценю ваше время и помощь. - person mumu.W; 07.01.2016

  1. Из-за того, как SAS обрабатывает шаг данных, порядок операторов не всегда имеет значение. Я не знаю в данном случае, имеет это значение или не имеет значения, но это определенно нетрадиционно. Обычно ИНФОРМАТ / ФОРМАТ ставится перед оператором ввода. Однако вы можете запустить его и довольно легко проверить.
  2. Это метод управления указателем, который перемещает курсор чтения в указанный столбец. Документация ясна:
    # P1 #
  3. $ определяет символьную переменную, длина или формат переменной не требуются и могут быть предварительно указаны с помощью операторов INFORMAT / FORMAT / LENGTH.
person Reeza    schedule 05.01.2016
comment
Спасибо за ответ! - person mumu.W; 07.01.2016