#sas #sas-macro
Вопрос:
Я пытаюсь импортировать несколько текстовых файлов в SAS. Особенность данных заключается в том, что в первой строке есть метки для некоторых переменных, а во второй строке есть текст, указывающий тип некоторых переменных. В третьей строке указаны имена переменных. Я намеревался использовать макрос для чтения файлов, так как первые 7 переменных имеют одинаковые имена. Я не уверен, как программно обрабатывать атрибуты переменных в файлах. Пожалуйста, подскажите, как я мог бы это сделать.
Код до сих пор:
%macro text2sas(filenam=);
proc import datafile="../amp;filenam..txt"
out="amp;filenam"
dbms=dlm replace ;
delimiter = '09'x;
getnames=no;
datarow=1;
guessingrows=max;
run;
%mend text2sas;
%text2sas(filenam=convdat);
%text2sas(filenam=tratdat);
Данные для convdat.txt выглядит так:
"Dance retail:" "Dummy measurement completed successfully?" "Dramatic measurements?" "Maximal travel :" "Velocity time at start:" "Mean velocity at start:" "Maximal velocity at end:" "Velocity time iinterval:" "Mean velocity interval:" "Crain Dp:"
date string string number number number number number number number
RELAXT RAIN PLUCK RAPPLE VRAT GROSS PANGLE "Straint" "Etramp" "Crumpa" "Cafin" "Cafinat" "Cafinab" "Cafinavr" "Cafinap" "cafinal"
X5980B00099 "CF" G0001001 1234 "Vlapa1" 1 "Crt appoi" "10-May-2010" "1" "1" "" "" "" "" "" "" ""
X5980B00099 "CF" G0001002 1234 "Vlapa1" 1 "Crt appoi" "13-May-2010" "1" "1" "" "" "" "" "" "" ""
X5980B00099 "CF" G0001003 1234 "Vlapa1" 1 "Crt appoi" "19-may-2010" "1" "1" "" "" "" "" "" "" ""
X5980B00099 "CF" G0001004 1234 "Vlapa1" 1 "Crt appoi" "26-may-2010" "1" "1" "0.45" "0.55" "0.98" "0.76" "0.98" "0.12" "5.77"
Данные для тратдата выглядят так:
"Arbitrary carpets" "Household items" "Garage material" "Sundry data (everything else)" "Vehicle number" "Strains" "ITM" "Finals" "Dreadspan" "Printers" "Comment 1" "comment 2" "Grapple" "Drops" "Triangles"
boolean boolean boolean boolean boolean boolean boolean boolean boolean boolean string boolean boolean boolean boolean
RELAXT RAIN PLUCK RAPPLE VRAT GROSS PANGLE "Ant" "App" "Cro" "BRon" "Dramas" "Slacks" "CRAT" "Frob" "Rilo" "Ph7jj" "P10rt" "Irup" "GLk2" "Dap3" "Oreta"
X5980B00099 "GB" G0001001 1234 "Vlapa1" 1 "Pangolin train" "" "checked" "" "checked" "" "checked" "checked" "" "" "" "" "" "" "" ""
X5980B00099 "GB" G0001002 1234 "Vlapa1" 1 "Pangolin train" "" "" "" "checked" "" "checked" "checked" "" "" "" "" "" "" "" ""
X5980B00099 "GB" G0001003 1234 "Vlapa1" 1 "Pangolin train" "checked" "" "" "checked" "" "checked" "checked" "" "" "" "" "" "" "" ""
X5980B00099 "GB" G0001004 1234 "Vlapa1" 1 "Pangolin train" "checked" "" "" "checked" "" "checked" "checked" "" "" "" "" "" "" "" ""
Комментарии:
1. Являются ли переменные одинаковыми в каждом из файлов или только в первых 7? Попробуйте установить значение datarow=3 равно 1, чтобы начать с строки 3, но таким образом вы не получите никаких имен переменных.
2. Во-первых, для этого вам не нужен макрос. Во-вторых, попробуйте использовать шаг данных с инструкциями ввода / вывода для чтения файла .txt.
3. Спасибо за ваш ответ. Только первые 7 переменных одинаковы.
Ответ №1:
Окончательный ввод будет включать указание SAS перейти к строке 3, но, как отмечает Риза, вы потеряете свои метаданные, если просто перейдете к Datarow=4
ней .
Я рекомендую проанализировать файл на этапе предварительной обработки и преобразовать эти метаданные во входные инструкции. Это может быть сложно, но это не должно быть так уж плохо… однако это выходит за рамки ответа на StackOverflow.
Вы можете посмотреть в моих презентациях Написание кода С помощью вашего программирования на основе данных и документации (в соавторстве), чтобы узнать, какие действия вы можете выполнить в отношении написания входных инструкций. У вас нет в точности того, что ожидает каждый из них, но вы можете ввести эти первые несколько строк, используя ввод шага данных, а затем перенести этот набор данных в более полезный формат.
Комментарии:
1. Спасибо вам за это. Я посмотрю вашу презентацию.
Ответ №2:
Похоже, что в первых трех строках есть МЕТКА, ТИП и ИМЯ для столбцов. Поэтому сначала прочтите это и используйте информацию для создания кода для чтения фактических строк данных.
Что-то вроде этого:
data headers ;
length row col 8 type $32 value $200 ;
infile file2 dsd dlm='09'x truncover length=ll column=cc ;
do type='LABEL','TYPE','NAME';
row 1;
do col=1 by 1 until(cc>ll);
input value @ ;
if not missing(value) then output;
end;
input;
end;
stop;
run;
proc sort; by col row; run;
proc transpose data=headers out=meta(drop=_name_) ;
by col;
id type ;
var value;
run;
Который для этого второго файла должен получить такие данные, как:
Obs col NAME LABEL TYPE
1 1 RELAXT
2 2 RAIN
3 3 PLUCK
4 4 RAPPLE
5 5 VRAT
6 6 GROSS
7 7 PANGLE
8 8 Ant Arbitrary carpets boolean
9 9 App Household items boolean
10 10 Cro Garage material boolean
11 11 BRon Sundry data (everything else) boolean
12 12 Dramas Vehicle number boolean
13 13 Slacks Strains boolean
14 14 CRAT ITM boolean
15 15 Frob Finals boolean
16 16 Rilo Dreadspan boolean
17 17 Ph7jj Printers boolean
18 18 P10rt Comment 1 string
19 19 Irup comment 2 boolean
20 20 GLk2 Grapple boolean
21 21 Dap3 Drops boolean
22 22 Oreta Triangles boolean
Которые вы можете использовать для создания кода, например:
data want ;
infile file2 dsd dlm='09'x truncover firstobs=4 ;
input
RELAXT :$20.
RAIN :$5.
PLUCK :$20.
RAPPLE
VRAT :$20.
GROSS
PANGLE :$40.
Ant :$1.
App :$1.
Cro :$1.
BRon :$1.
Dramas :$1.
Slacks :$1.
CRAT :$1.
Frob :$1.
Rilo :$1.
Ph7jj :$1.
P10rt :$50.
Irup :$1.
GLk2 :$1.
Dap3 :$1.
Oreta :$1.
;
label
Ant ="Arbitrary carpets"
App ="Household items"
Cro ="Garage material"
BRon ="Sundry data (everything else)"
Dramas ="Vehicle number"
Slacks ="Strains"
CRAT ="ITM"
Frob ="Finals"
Rilo ="Dreadspan"
Ph7jj ="Printers"
P10rt ="Comment 1"
Irup ="comment 2"
GLk2 ="Grapple"
Dap3 ="Drops"
Oreta ="Triangles"
;
run;
Комментарии:
1. Это действительно полезно, я принимаю его, и он работает для извлечения метаданных из файла. Спасибо за ваш совет.