Укажите формат с помощью proc import sas - PullRequest
0 голосов
/ 12 июня 2018

Я пытаюсь импортировать некоторые данные из файла .txt в WPS (который работает с языком SAS).Все работало отлично, пока я не понял, что для одного столбца / переменной некоторые мои наблюдения были урезаны.Например, в столбце / переменной Type, мои 5 первых наблюдений в исходном файле были:

RAN
FG
MAJOFG
ARBA
ARBV

, но в моем наборе данных в sas вот данные, которые я получаю:

RAN
FG
MAJ
ARB
ARB

Поэтому я подумал об использовании формата во время импорта, чтобы sas всегда брал 8 долларов.формат.Может ли он работать с proc import?Вот мой код:

proc import out = sasuser.frais
  datafile="~/NAS/M/XXX.txt"
  dbms=dlm replace;
  delimiter=";";
  getnames=yes;
  datarow=2;
run;

Я также пытался использовать данные infile, но по какой-то причине он перемещает мои строки данных (начало второй строки начинается в конце первой, вероятно потому, что большинствовремени мои последние 4 столбца / переменные пусты).И у меня есть более 20 переменных, большинство из которых должным образом импортированы sas (в смысле формата, который я имею в виду), поэтому, если бы я мог избежать именования формата для каждой из них, было бы здорово!

Ответы [ 3 ]

0 голосов
/ 12 июня 2018

Попробуйте использовать оператор GUESSINGROWS:

Proc IMPORT … ;
  …
  GUESSINGROWS = 100;
run;

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

  INFILE … FIRSTOBS=2 DLM=';' DSD MISSOVER;
  length v1-v20 $30;
  INPUT v1-v20;

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

0 голосов
/ 12 июня 2018

Моя проблема в том, что я планирую использовать этот код импорта для нескольких файлов, и порядок наблюдений для типа является случайным.Таким образом, вполне возможно, что для 10 или 100 строк наблюдения имеют длину 3, а затем одно наблюдение 6. Но даже если я не знаю порядок, я знаю возможные значения разностей (с максимальной длиной 6),Так что угадайка не будет работать в моем случае.Но я нашел способ исправить свой код с помощью ссылки, предоставленной Джоном Доу (https://communities.sas.com/t5/Base-SAS-Programming/Text-File-Import-force-the-correct-Informat-and-format/td-p/281701). Я взял данные, сгенерированные при импорте процедур, и изменил их для одной переменной, которая требовала изменений. Спасибо всем!

0 голосов
/ 12 июня 2018

Вы можете получить приемлемые результаты, изменив параметр guessingrows, а не указав информат, например:

data _null_;
  file "%sysfunc(pathname(work))\test.txt";
  infile cards;
  input;
  put _infile_;
  cards;
RAN
FG
MAJOFG
ARBA
ARBV
;
run;

proc import out = example
  datafile="%sysfunc(pathname(work))\test.txt"
  dbms=dlm replace;
  delimiter=";";
  getnames=yes;
  datarow=2;
  guessingrows=3;
run;

Если вы измените это значение с 3 на 2, при импорте процедур будет выглядеть толькопервые 2 строки данных при угадывании подходящей длины для переменной RAN и усечение происходит для последующих строк с более длинными значениями.

...