在SAS中读取长度超过32767个字符的文本行

在SAS中读取长度超过32767个字符的文本行,sas,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;

我有一个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中传递)。第二步,我首先将数据带到Oracle,然后在那里组装要解析的单元格。
但是,只有当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;

您仍然可以在代码中执行一些相同的操作(但我想,除了压缩控制字符之外,您不需要执行大部分操作)。

您是如何读取它的?什么代码?SAS完全能够读取32767行以上的数据,我已经在一行中读取了接近一百万个字符的xml文件。没问题。@Joe我用我现在使用的代码更新了我的问题。@Joe我很想看看您使用的方法。当XML存储在SAS变量中时,您是否解析了它?如果是,如何搜索,因为您必须跨行或跨变量搜索才能找到结束标记。@RobertPenridge这是以前的雇主,因此我不再有代码,但我根据不同的需要使用了两种不同的方法。我使用了一个带有XML映射的
LIBNAME
,这在大多数情况下都非常有效。如果我没记错的话,我用
“>”分隔另一个。您也可以使用
@”“`以及.UFF!!!这是一个大的!SAS DS2克服了32767的限制。但这只适用于结构化SQL表。我不确定DS2将如何处理XML。当我不得不处理这个问题时,我放弃了,通过运行一个从sasdatastep程序调用的Python脚本来解决这个问题。这对我来说效果很好,输出66130个字符,但输入文件是74615。由于某些原因,它没有写入最后一部分。请尝试添加
TRUNCOVER
-我认为RECFM=f不需要它,但它可能是。为什么在这里使用@1?这是将整行读入变量的最简单方法。你的方法也很好,只是更多的打字。如果你省略了@ 1,但在信息中留下,SAS将有点解决问题-但我认为这是错误的,因为它混合输入方式的方式是危险的,如果你不知道你在做什么。