Proc Import没有读取所有列

时间:2015-09-29 13:56:45

标签: sas

我有一个包含2500个观察值和300个变量的mer文件。我使用proc import来读取SAS,但它只能读取200个变量和2500个观察值。日志表明导入成功。

我尝试过“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;

4 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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;

答案 2 :(得分:0)

您的问题的简单解决方案如下 1)将文件拆分为2部分列1- 200和201,直到最后,确保两个文件都有一些公共密钥,以便以后合并它们 2)将它们导入两个单独的数据集中 3)使用proc sql并在公共密钥的帮助下合并数据集。

答案 3 :(得分:0)

我在这里遇到了同样的问题,这对我有用:

PROC IMPORT OUT= &BASE_SAIDA. DATAFILE= "bla bla bla"
            DBMS=CSV REPLACE; 
            **delimiter='09'x;** 
            GETNAMES=YES;
RUN;

当我使用 DELIMITER = '09'x 时,它返回所有列。