创建解析 SAS 的新列

问题描述 投票:0回答:1

我有一个包含不同地址的专栏,如下所示:

Mathilde 45 rue du Chemin neuf 35950 Chichigneux

我需要创建新列,一列用于名称(此处为 Mathilde),一列用于数字 (45),一列用于街道 (rue du Chemin neuf),一列用于邮政编码 (35950),一列用于城市 (Chichigneux) 。 我已经成功地使用此代码完成了除街道名称之外的所有操作:

DATA DmExo3.Test;
    SET DmExo3.Adresses;
    /* Extraction du nom */
    Nom = scan(Contact, 1, ' ');
    /* Extraction du numéro de rue */
    Numero = scan(Contact, 2, ' '); 
    /* Extraction du nom de la rue */
    /* Extraction du code postal */
    CodePostal = input(scan(Contact, -2, ' '), 5.); 
    /* Extraction de la ville */
    Ville = scan(Contact, -1, ' ');
RUN;

我在初级班,所以答案应该不会太复杂,但我被困住了,因为扫描不允许你选择几个单词。我尝试过使用 substr,但是街道名称开始和结束的位置随每个地址而变化。

sas
1个回答
0
投票

街道位于 numero 和 postal 之间。

您可以使用

findw()
函数来定位您根据之前的假设找到的字符串的位置:(第2个单词是numero,-2nd单词是postal),并提取其中。

邮政编码被保留为数字变量有什么原因吗?

data have;
  contact = 'Mathilde 45 rue du Chemin neuf 35950 Chichigneux';
run;

data want;
  set have;

  Nom    = scan(Contact,  1, ' ');
  Numero = scan(Contact,  2, ' '); 
  Postal = scan(Contact, -2, ' ');
  Ville  = scan(Contact, -1, ' ');

  p1 = findw(contact, trim(numero), ' ');
  p2 = findw(contact, trim(postal), ' ', 'b');

  if 0 < p1 < p2 then 
    street = substr(contact,p1,p2-p1);

  drop p1 p2;
run;
© www.soinside.com 2019 - 2024. All rights reserved.