我有一个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个字符时,它才有效。
答案 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;
你仍然可以在你的代码中做一些相同的事情(但我不怀疑,除了压缩控制字符之外,不需要大部分内容)。