2014-10-16 2 views
0

Я не уверен, что это возможно (или глупый вопрос), поскольку я только начал смотреть на SAS на прошлой неделе. Я сумел импортировать свой файл .CSV в набор данных SAS с помощью:Извлечение «динамической» части из набора данных SAS

proc import 

Указание guessingrows= ограничить мою out=.

Моя проблема в том, что мои CSV-файлы для импорта не имеют одинаковой структуры, что я заметил после написания кода с помощью obsnum=, чтобы указать начальные и x-строки для чтения.

Итак, мой вопрос мошен или не SAS способен либо искать определенную строку/пустую переменную, а использовать в качестве конечного наблюдения?

Мои данные выглядит (но количество Var_x изменяется для каждого файла):

Structure of data

Сначала я пытался смотреть на slice=, но это только полезно, если я знаю, что точные места, представляющие интерес, так как Пустое пространство между группами может меняться.

Возможно ли использовать функцию set, чтобы указать, чтобы начать с строки 1 и считать до заполнения пустого поля? Или вы можете перенаправить меня на какую-то функцию (которую я не смог найти)?

Я хотел бы посмотреть каждый «блок» отдельно и обработать.

Спасибо заранее

+0

В зависимости от ваших данных может быть лучше написать собственный шаг импорта, используя вместо этого инструкцию в файле. Возможно, лучший пример того, с чем начинаются ваши начальные данные, и то, что вы хотите в качестве вывода, - лучший вопрос для ответа. – Reeza

+0

'PROC IMPORT' не может этого сделать. Вам определенно придется написать свой собственный код импорта (не так уж сложно). – Joe

+0

Я вижу ... Я только что взял SAS на прошлой неделе, поэтому мои знания очень ограничены. Так что спасибо за указание. Поскольку у меня есть файл CSV, я предполагал, что импорт proc будет полезен. Проделайте некоторое исследование документации в файле, а затем! – user1865820

ответ

0

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

Таким образом, импорт proc на весь набор данных без ограничений.

Затем используйте шаг данных и счетчик для обработки данных и вывода при необходимости. Что-то вроде:

data output1 output2 output3; 
    set imported_data; 
    if _n_ = 1 then counter = 1; 
    var1lag = lag(var1); 
    if var1 = '' and var1lag ne '' then counter=counter+1; 
    if counter = 1 then output output1; 
    else if counter = 2 then output output2; 
    else output output3; 
run; 

data output1; 
    set output1; 
    if var1 = '' and var2 = . and var3 = . then delete; 
run; 
data output2; 
    set output2; 
    if var1 = '' and var2 = . and var3 = . then delete; 
run; 
data output3; 
    set output3; 
    if var1 = '' and var2 = . and var3 = . then delete; 
run; 

Приведенный выше код выводит на три набора данных на основе значения счетчика. Функция задержки позволяет нам искать строку, чтобы убедиться, что в первый раз мы не видим никаких данных и не обновляем счетчик, поскольку мы не видим никаких данных.

Затем мы вернемся и удалим все полные данные для наших наборов данных.

Вы можете легко использовать некоторые массивы, чтобы сделать эту работу более масштабируемой, если у вас много выходов вместо инструкций if/else для вывода данных.

+0

Я посмотрю на код, когда получаю шанс. Спасибо за ответ. Я все еще нахожусь в самом базовом/учебном фазе, поэтому я пытаюсь это и так!В то же время я играл вокруг создания ID-кулона, чтобы идентифицировать индекс всех пустых значений, позволяя мне использовать «nobs» для указания начала/конца. – user1865820