在 SAS 中读取超过 32767 个字符的文本行
Read text line longer than 32767 characters in SAS
我有一个 xml 文件只包含一个长度超过 32767 的文本行。现在 SAS 在第 32767 个字符处截断它并停止进一步读取这一行。
任务是将输入行拆分为单独的变量或单独的观察值。
我用来读取文件的代码是:
data out (drop=v_length);
length xml_text 767;
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,然后我 assemble 单元格进行解析。
但是,它仅在 xml 文件的每一行少于 32767 个字符时有效。
如果您一次输入 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;
你仍然可以做一些你在代码中做的相同的事情(但我怀疑除了压缩控制字符之外不需要大部分)。
我有一个 xml 文件只包含一个长度超过 32767 的文本行。现在 SAS 在第 32767 个字符处截断它并停止进一步读取这一行。 任务是将输入行拆分为单独的变量或单独的观察值。 我用来读取文件的代码是:
data out (drop=v_length);
length xml_text 767;
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,然后我 assemble 单元格进行解析。 但是,它仅在 xml 文件的每一行少于 32767 个字符时有效。
如果您一次输入 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;
你仍然可以做一些你在代码中做的相同的事情(但我怀疑除了压缩控制字符之外不需要大部分)。