在SAS中读取长于32767个字符的文本行

时间:2015-04-16 10:34:46

标签: sas

我有一个xml文件只包含一个长度超过32767的文本行。现在SAS将其截断为第32767个字符并停止进一步读取该行。 任务是将输入行拆分为单独的变量或单独的观察。 我用来读取文件的代码是:

data out (drop=v_length);
    length xml_text $32767;
    retain xml_text v_length gr_split;
    infile tempxml encoding='utf-8' end=last;
    input;
    if _n_ = 1 then do;
        v_length = length(left(_infile_));
        gr_split = 1;
    end; else
        v_length=v_length+length(left(_infile_));
    if v_length gt 32767 then do;
        gr_split + 1;
        v_length=length(left(_infile_));
    end;
    if _n_ = 1 or v_length=length(left(_infile_)) then do;
        xml_text = compress(left(_infile_),,'c');
    end; else
        xml_text = trim(xml_text)||compress(left(_infile_),,'c');
    if last then do;
        call symput('NumOfTextGroups',gr_split);
        call symput('LastRow',_n_);
    end;
run;

当整个xml长度不超过32767时,代码会生成一个单元格。否则它输出n行。在第一种情况下,我可以直接在Oracle中解析它(一旦数据在那里传递)。第二,我首先将数据带到Oracle,在那里我组装要解析的单元格。 但是,只有当每行xml文件少于32767个字符时,它才有效。

1 个答案:

答案 0 :(得分:3)

如果您一次带来32767,那么您应该使用recfm=f(固定记录长度)。这将创建32767长的行。

data for_oracle;
  infile "\wherever\blah.xml" lrecl=32767 recfm=f truncover;
  input @1 myline $CHAR32767.; *char is important in case a space exists that you care about at the start;
run;

你仍然可以在你的代码中做一些相同的事情(但我不怀疑,除了压缩控制字符之外,不需要大部分内容)。