【发布时间】:2018-10-16 14:15:04
【问题描述】:
我正在导入一个带有行和列分隔符的平面 .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'~''#@#@'
由于多种原因,我在尝试导入此数据时遇到很多问题:
为字符变量设置非常大的长度会使导入过程非常耗时,而且我们不知道最长字符变量的长度,因此每次迭代需要更多时间
当结构意味着下一行可以在所有列都被填充之前发出信号时,我还没有找到一种方法来处理列和行分隔符,即不能只做一个额外的列用于行分隔符并将其删除。
我尝试过的 SAS 代码:
data want;
infile "file-location" dlmstr = "#@#@" dsd recfm = F lrecl=10000000000;
informat var $200.
input var $ @@;
run;
非常感谢任何经验和见解。
【问题讨论】:
-
您发布的示例使它看起来像您的行尾标记(我讨厌将这些视为分隔符)包含一个实际的换行符。
-
对于数据集变量,您的长字符串是否超过 32K 最大值?
-
我还没有检查,平面文件没有包含关于所包含变量的最大长度的文档,我将包含文件的前两行
-
我推荐使用
LIST命令来查看文件。因此,要阅读完整文件并查看最大行长是多少,并列出前 5 行运行代码,如下所示:data _null_; infile "file" lrecl=1M; input; if _n_<=5 then list; run; -
有效数据是否包含任何这些单独的字符?
~'#@?如果不是,那么只需将它们全部用作分隔符。
标签: import sas delimiter flat-file sas-studio