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

Import 导入带有行和列分隔符的平面文件,import,sas,delimiter,flat-file,sas-studio,Import,Sas,Delimiter,Flat File,Sas Studio,我正在导入一个包含行和列分隔符的平面.txt文件。问题是行分隔符用于减小文件大小,因此通常会跳过其余的列。另一个问题是,最长字符的长度未知,因此,如果此字符字符串被截断,那么我们将丢失分隔符,整个结构将崩溃 我面临的问题的一个明确例子包括 .txt文件 Var1'~'Var2'~'Var3'~'Var4'~'Var5'~'Var6'#@#@' 1'~''#@#@' This is going to be a really long string as an example of a situat

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

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

.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;
    

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

    如果您每行有一条记录,那么只需在infle上使用
    misshover
    truncover
    选项即可;这将告诉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进行一些奇特的步法


    就字符串变量长度而言,最可能需要时间的是写出文件。使用
    选项compress=char
    打开数据集压缩,假设这些文件的最终用途与此兼容(如果您只是在这些文件上运行SAS代码,则应该是)。然后它不会尝试写出完整的变量长度。如果失败,您可能需要重新考虑您的数据集结构以避免出现此问题-您需要提出一个包含更多细节的单独问题,以找出最佳解决方案。

    您发布的示例使其看起来像您的行尾标记(我讨厌将其视为分隔符)包括实际换行。对于数据集变量,您的长字符串是否超过32K max?我还没有检查,平面文件中没有包含变量最大长度的文档,我将包括文件中的前两行。我建议使用
    LIST
    命令查看该文件。因此,要读取完整文件并查看最大行长度是多少,还要列出前5行,请运行如下代码:
    data\u null;填充“文件”lrecl=1M;输入;如果有效数据是否包含这些单个字符<代码>~'#@
    ?如果不是,那么就把它们都用作分隔符。嗨,乔,谢谢你提供的信息,我目前正在阅读和探索truncover选项。我没有明确说明.txt文件的结构,我从一个数据提供程序收到了它,并且行中并不是只有长的charvar列,我的典型问题是char变量太长以至于截断,因此分隔符被截断并丢失。我希望truncover命令能够解决这个问题?我目前正在测试您提出的解决方案,因此需要一点时间来响应结果。我收到以下错误消息:lrecl超过了infile/infile=variable语句(32767*)的最大允许长度。您必须2次传递数据文件,第1步确定所需的列大小,对于非常长的文本,确定包含数据所需的32K长度字符变量的数量(这将为代码生成(aka宏)做准备)。第二遍将使用您的codegen读取数据文件。谢谢,我会解决这个问题