如何读取间距不均匀的数据?

时间:2016-11-03 16:22:46

标签: sas

我的数据似乎没有一致的间距或定位。它看起来像:

1675 C Street , Suite 201   
Anchorage   AK  99501   
61.205475   -149.886882
600 Azalea Road 
Mobile    AL      36609 
30.656824   -88.148781
1601 Harbor Bay Parkway , Suite 150 
Alameda   CA    94502   
37.726114   -122.240546
1900 Point West Way,  Suite 270 
Sacramento      CA  95815   
38.5994175  -121.4315844
3600 Wilshire Blvd., Suite 1500 
Los Angeles   CA    90010   
34.06153    -118.303463

从此我想提取街道地址,城市名称,州,邮政编码,纬度和长度。我认为以下代码可以工作,但它会产生非常奇怪的结果。

data voa;
    input Address $50.;
    input City $ State $ Zip;
    input Latitude Longitude;
    datalines;

我认为问题来自于元素间距或位置不一致的事实。

2 个答案:

答案 0 :(得分:3)

使用LIST输入您的数据将正常工作,您只需添加“查找双分隔符选项”&到CITY加上需要16美元左右。

input City &$16. State $ Zip;

enter image description here

答案 1 :(得分:1)

如果没有一致的分隔符或固定宽度字段,使用scan更容易做到:

data want;
infile cards truncover;
  length STATE $2 CITY $32;
  input Address $50.;
  input;
  ZIP = input(scan(_INFILE_, -1),5.);
  STATE = scan(_INFILE_, -2);
  CITY = trim(substr(_INFILE_,1,index(_INFILE_,STATE) - 1));
  input Latitude Longitude;
cards;
1675 C Street , Suite 201   
Anchorage   AK  99501   
61.205475   -149.886882
600 Azalea Road 
Mobile    AL      36609 
30.656824   -88.148781
1601 Harbor Bay Parkway , Suite 150 
Alameda   CA    94502   
37.726114   -122.240546
1900 Point West Way,  Suite 270 
Sacramento      CA  95815   
38.5994175  -121.4315844
3600 Wilshire Blvd., Suite 1500 
Los Angeles   CA    90010   
34.06153    -118.303463
;
run;