2016-11-03 7 views
1

私は、一貫した間隔または配置を持たないデータを持っています。それは次のようになります:不均一な間隔でデータを読み取るにはどうすればよいですか?

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; 

問題は、要素の一貫した間隔や配置がないという事実から来ていると思います。一貫性のある区切り文字または固定幅フィールドがない場合には、これはscanを使用して行うことが容易である

答えて

3

あなたのデータは、あなただけの「二重の区切りオプションを探し追加する必要がありLIST入力を使用して正常に動作します"&をCITYに加えて、もう少し$ 16ほど長くする必要があります。共有するためのおかげで - 私は前にこの機能を使ったことがない

input City &$16. State $ Zip; 

enter image description here

+1

! – user667489

+0

また、アドレスの前に ':'が必要ですか? – Joe

+0

@Joeあなたは:を追加することができます:しかし、それが動作するその行の唯一のフィールドであるため、書式付き入力と同様にうまくいきます。 –

1

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;