Есть ли способ анализировать и помечать построчную контактную информацию с помощью SAS или R?

#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(*)) (=/);