gpt4 book ai didi

导入带有行和列分隔符的平面文件

转载 作者:行者123 更新时间:2023-12-01 15:29:25 24 4
gpt4 key购买 nike

我正在导入一个包含行和列分隔符的平面 .txt 文件。问题在于行分隔符用于减小文件大小,因此通常会跳过其余的列。另一个问题是最长字符的长度是未知的,因此,如果这个 char 字符串被截断,那么我们就会失去定界符,整个结构就会分崩离析。

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

.txt文件

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. 为字符变量设置一个非常大的长度会使导入过程非常耗时,而且我们不知道最长字符变量的长度,因此每次迭代都需要更多时间

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

我尝试过的 SAS 代码:

data want;
infile "file-location" dlmstr = "#@#@" dsd recfm = F lrecl=10000000000;
informat var $200.
input var $ @@;
run;

非常感谢任何经验和见解。

最佳答案

如果你每行有一条记录,那么只需在 infile 上使用 missovertrunco​​ver 选项;这将告诉 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 代码,它应该是)。然后它不会尝试写出完整的可变长度。如果失败,您可能需要重新考虑您的数据集结构以避免出现此问题 - 您需要提出一个包含更多详细信息的单独问题,以找到最佳解决方案。

关于导入带有行和列分隔符的平面文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52837560/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com