2015-09-29 35 views
0

我有一个包含2500个观察值和300个变量的mer文件。我使用proc import来读入SAS,但它只能读取200个变量和2500个观察值。日志说明进口是成功的。Proc Import没有读取所有列

我试过“getnames = no”,导致导入300个变量,但第一行包含变量名,所以我想保留为“getnames = yes”。我已经尝试将mer文件转换为csv并执行proc导入,但我不断收到错误。关于我在做什么的任何想法都是错误的?我正在使用SAS 9.3。

 proc import datafile="XXX.mer" 
     out=xx.xxxxx dbms=dlm replace; 
     delimiter=","; 
     getnames=yes; 
     datarow=2; 
     guessingrows=5000; 
     run; 
+0

您是否有权访问企业指南?我发现它的数据导入任务可以成为'PROC IMPORT'的一个很好的调试工具。这听起来像你可能在csv文件的变量名称行中遇到变量名称问题。你能否看到它使用'getnames = no'输出的第一条记录是否具有所有正确的变量名?如果你有任何SAS无效的变量名(例如以数字开头,有空格等),你可能想打开'options validvarname = any',看看是否能缓解这个问题。 –

+0

我没有企业指南。使用getnames = no时,它输出的第一条记录具有所有正确的变量名称,但是我知道我的一些变量名已被截断(这对我来说可以,但不知道是否会导致问题)。 –

+0

@StuSztukowski我试过'options validvarname = any',它仍然导致了200而不是300个变量的输入。 –

回答

0

诺曼:

您可以使用一个小的SAS程序向你展示围绕控制字符的上下文中的数据文件的标题行。您应该看到0D 0A和可能09

data _null_; 
    infile "XXX.mer" recfm=n end=end; 

    retain cc_context mark; 

    length c $1; 
    input c $char1. ; 

    if not mark and c < '20'x then mark = _n_; 

    length cc_context $20; 

    if _n_ < lengthc(cc_context) 
    then substr(cc_context,_n_,1) = c; 
    else cc_context = substr(cc_context||c,2,20); 

    if _n_ = mark + 10 then do; 
    length info $150; 
    info = cc_context; 

    p = ANYCNTRL(info); 
    do while (p); 
     c = substr(info,p,1); 
     cx = '<' || put(c,$hex2.) || '>'; 
     info = tranwrd(info,c,trim(cx)); 
     p = ANYCNTRL(info); 
    end; 

    put info; 
    cc_context = ''; 
    mark = 0; 
    mark_count + 1; 
    if mark_count >= 10 then stop; * limit the review; 
    end; 
run; 
0

您是否尝试告诉PROC IMPORT读取没有列名的文件?

proc import datafile="XXX.mer" 
    out=xx.xxxxx dbms=dlm replace; 
    delimiter="," 
; 
    getnames=no; 
    datarow=2; 
    guessingrows=5000; 
run; 

然后,您可以读取第一行中的值并将它们用作标签。

filename code temp; 
data labels ; 
    infile "XXX.mer" dsd obs=1 ; 
    length varnum 8 name $32 label $256 ; 
    do varnum = 1 by 1 ; 
    input label @; 
    name = cats('VAR',varnum); 
    output ; 
    file code ; 
    put 'LABEL ' name '=' label :$quote. ';' ; 
    end; 
run; 
proc datasets lib=XX nolist; 
    modify XXXXX; 
    %include code/source2; 
run; 
0

简单的解决问题的方法是按下面 1)拆分文件2份列1 200和201,直到最后,确保两个文件应该有一些共同的键,以便您可以合并他们稍后 2)将它们导入两个单独的数据集 3)使用proc sql合并数据集并使用公用密钥。