#r #sas
#r #sas
Вопрос:
Я очистил несколько веб-страниц с контактной информацией. Я хотел бы добавить префикс label к соответствующим строкам контактной информации; например, имя, адрес 1 … n и страна.
Актуальная информация:
ABC Inc.
Sam Iselin
101 Jim Street
Suite 212
Royal Park, IL, 60302
United States
Ожидаемый результат:
Company: ABC Inc.
Name: Sam Iselin
Address 1: 101 Jim Street
Address 2: Suite 212
Address 3: Royal Park, IL, 60302
Country: United States
Комментарии:
1. немного излишне использовать SAS для этого. Лучше использовать perl или python.
2. Пожалуйста, уточните, всегда ли будет 6 строк на контакт (не больше, не меньше) и всегда в том же порядке, или содержимое должно быть проверено, чтобы определить, какие детали представлены. Если последнее, пожалуйста, уточните правила, так как, например, название компании может содержать название страны, или название страны может быть сокращено и т.д.
3. Означает ли scraped , что информация теперь находится в текстовом файле, который должен быть считан в набор данных SAS через
input
?4. @ Amir Да, есть адреса, у которых есть только одна адресная строка и несколько двух, но не более 3 строк адресов. И нет названий компаний, которые имеют названия стран или сокращенные названия стран.
5. @ Richard, да, очищенная информация уже находится в текстовом файле.
Ответ №1:
Предполагая, что порядок записей всегда одинаков:
text="ABC Inc.
Sam Iselin
101 Jim Street
Suite 212
Royal Park, IL, 60302
United States"
parsed_tbl <- cbind(c("Company:","Name:","Address 1:","Address 2:","Address 3:", "Country:"),str_split(text,"nn")[[1]])
parsed_str <- paste(apply(parsed_tbl,1,paste,collapse=" "),collapse="nn")
cat(parsed_str)
Company: ABC Inc.
Name: Sam Iselin
Address 1: 101 Jim Street
Address 2: Suite 212
Address 3: Royal Park, IL, 60302
Country: United States
Ответ №2:
Согласно вашим комментариям, данные всегда будут в заданном порядке, а адресные строки могут варьироваться от 1 до 3 .. можно использовать следующий код
data have;
infile 'Y:my progscsv_ipfilesscraped.txt';
input all_data amp;$50.;
run;
proc sql noprint;
select count(*) into :max_obs from have;
quit;
data want;
length mod_data $60.;
set have;
if _n_=1 then mod_data=catx(": ","Company",all_data);
else if _n_=2 then mod_data=catx(": ","Name",all_data);
else if _n_=amp;max_obs then mod_data=catx(": ","Country",all_data);
else
do;
number=_n_-2;
mod_data="Address "||number||": "||all_data;
end;
drop all_data number;
run;
proc print data=want; run;
Ответ №3:
input
Оператор может быть закодирован с использованием (variable-list) (informat-list)
конструкции для ввода каждой строки данных для каждой из ваших 6 переменных. Данные должны содержать 6 строк данных на «запись», чтобы добиться успеха с помощью этой техники.
Пример:
* make a fake scrape;
filename scrape temp;
data _null_;
file scrape;
put
"ABC Inc." /
"Abel Anderson" /
"18 Andover St" /
"Suite A" /
"Annapolis, MD 12345"/
"United States" /
"XYZ Inc." /
"Xavier Xalionton" /
"18 Exacto Lane" /
"Suite 3" /
"Xephyrton, NM 55455"/
"United States"
;
filename out "C:tempscrape-labeled.txt";
data _null_;
infile scrape truncover;
* file out; * send output to log for now, uncomment to send to file;
array field $200 field1-field6; * array 6 pdv variables corresponding to a single record;
attrib /* label values will be used for output */
field1 label="Company:"
field2 label="Name:"
field3 label="Address 1:"
field4 label="Address 2:"
field5 label="Address 3:"
field6 label="Country:"
;
input (field(*)) ($CHAR200. /) @; * read in 6 lines to the arrayed variables all at once;
do over field; * output <label> <value> of each variable;
rowheader = vlabel(field); * label already has the : in it;
rowdata = vvalue(field);
put rowheader rowdata;
end;
run;
Если поля «имена», которые предшествовали данным, были «обычными» именами SAS без встроенных пробелов и допускали a =
вместо :
, вывод мог быть выполнен с помощью одного put
оператора, который также включал список переменных.
put (field(*)) (=/);