导入带有行和列定界符的平面文件

时间:2018-10-16 14:15:04

标签: import sas delimiter flat-file sas-studio

我正在导入带有行和列定界符的平面.txt文件。问题在于,行定界符用于减小文件大小,因此经常跳过其余的列。另一个问题是最长字符的长度是未知的,因此,如果此char字符串被截断,则我们将丢失定界符,并且整个结构会崩溃。

我面临的问题的一个明确例子包括

.txt文件

XGBoost

由于多种原因,我在尝试导入此数据时遇到很多问题:

  1. 为字符变量输入很大的长度会导致导入过程非常耗时,而且我们不知道最长的字符var的长度,因此每次迭代都花费更多的时间

  2. 我还没有找到一种同时处理列分隔符和行分隔符的方法,该结构意味着可以在所有列都被填充之前就发出下一行的信号,即不能仅仅创建一个额外的列删除行分隔符。

我尝试过的SAS代码:

Var1'~'Var2'~'Var3'~'Var4'~'Var5'~'Var6'#@#@'
1'~''#@#@'
This is going to be a really long string as an example of a situation where the long string is very large and so the truncated string does not indicate a delimiter and we lose data '#@#@'
1'~' 2'~' 3'~' 4'~' 5'~' 6'#@#@'
1'~' 2'~' 3'~''#@#@'

任何经验和见识都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

如果每行有一条记录,则只需对文件名使用missovertruncover选项;这将告诉SAS在达到EOL后停止读取。您仅需要处理怪异的定界符,如果尝试将其读入数字,它将导致错误;您可以尝试在预处理中先删除字符串。

data want;
  infile "yourfile-location" dlmstr="'~'" dsd lrecl=32767 truncover;
  input @;
  _infile_ = tranwrd(_infile_,"'#@#@'"," ");
  input var1 var2 var3 var4 var5 var6;
run;

如果以上出于某些原因而无法实现,则您在此处编写的方式也可能有效;基本上使用两个不同的定界符选项对字符串进行两次读取,一次使用“'#@#@'” dlmstr,然后使用“'〜'” dlmstr。或者,与其读两次,不如先读一次,然后再读第二遍。

data want;
  infile "yourfile-location" dlmstr="'#@#@'" dsd lrecl=32767;
  input @;
  array var[6] var1-var6;
  do _i = 1 to countc(_infile_,"~")+1;
    var[_i] = scan(_infile_,_i,"~");
  end;
run;

以上内容并不完美,因为它无法处理定界符周围的引号,但是您可以根据具体情况弄清楚-引号是否可以安全地压缩掉整个预输入内容,或者需要和SUBSTR做一些花哨的步法吗?

就字符串变量长度而言,很可能需要花费时间来写出文件。使用options compress=char;来打开数据集压缩,假设您最终使用的这些文件与此兼容(如果您只是在它们上运行SAS代码,则应该如此)。然后,它将不会尝试写出完整的可变长度。如果失败了,您可能需要重新考虑数据集结构以避免发生此问题-您需要询问一个单独的问题,并提供更多详细信息,以便在那里找到最佳解决方案。

相关问题