【问题标题】:SAS: importing text fileSAS:导入文本文件
【发布时间】:2015-04-21 01:26:13
【问题描述】:

导入的代码有什么问题?我正在尝试将文本文件导入 SAS。

proc import DATAFILE="C:\Users\Tiffany\Documents\Inpatientaveragelengthofstaysince2009.txt" 
   out=Indivs dbms=dlm replace;
   delimiter=' ';
   getnames=yes;
run;

我在下面收到这条消息:

错误:导入失败。有关详细信息,请参阅 SAS 日志。

【问题讨论】:

  • 日志说了什么?您可以通过单击屏幕底部的“日志”选项卡将日志向前移动。您确定您的文件在指定路径中吗?
  • 先去Logs,它会告诉你确切的原因,否则无法调试。
  • 我的 0.02 美元是它无法找到您的分隔符或文件本身。也许它是制表符而不是空格,类似的东西。但一定要发布整个错误消息,而不仅仅是那一行。

标签: sas


【解决方案1】:

通常在多次尝试导入过程失败后,我决定最好避免这样做,因为它有时会产生令人惊讶的结果。

您可以改为在数据步内使用 infile 命令:

data input_data; 
infile "../../file.txt"
firstobs = 2
dlm = " "
missover
dsd
lrecl = 32767
input
   var1 : $char128. /*string field of 128 chars long*/
   var2 : best32.   /*numbers of all types ints, floats, etc */
   ...
   /*do this for every variable (column) in you .txt file */  
;
run;

上面的代码或多或少是 proc 导入所做的。 proc import 的问题在于它试图“猜测”正确的选项(例如 dsd、missover 等)和数据类型,但并不总是成功。您可以找到更多关于这些选项的作用here

例如,missover 选项告诉 sas 在找到两个连续分隔符时要做什么。 (这应该被视为一个空列,并在读取下一个值时将一个值留空,还是只拉入下一个可用值?)

当然,上面的代码在包含大量列的长 txt 文件的情况下不是很实用,因为您必须自己键入每个列标签及其数据类型。

一个可能的解决方案是:

data headers;
infile "../../file.txt"
firstobs = 1
obs = 1
dlm = "_" /*make sure to here to use a delimiter DIFFERENT from the real one to keep everything in one observation*/
missover
lrecl = 32767
input
   whole_line : $char32767.
;
run;

上述步骤创建了一个数据集,其中包含一个观察值,其中包含由分隔符分隔的所有列标题。 现在你可以使用了:

proc sql noprint;
select distinct tranwrd(compress(line),","," ") as lineTest length=32767     into: headers from headers length;
quit;

上面的代码创建了一个名为 headers 的宏变量,其列名由空格分隔(tranwrd() 函数基本上将 ',' 替换为 ' ' 因为我通常使用 csv 文件,所以这对你来说可能不是必需的. 一般来说,使用空格作为分隔符可能不是一个好主意 - 如果您的字符串字段本身包含空格,则适用。您得到的错误实际上可能与此有关)

现在您可以循环访问宏变量,而不是编写每个列名并一一键入:

data inputFile (compress=binary) ;
    infile "../../file.txt"
    dsd
    dlm = ","
    lrecl = 32767
    firstobs = 2
    ;
    input
    %do i=1 %to %words(&headers);
        %let currCol = %scan(&headers. , &i.);
        &currCol : $char256.
    %end;
    ;
run;

这将创建您想要的数据集,而无需担心文件结构是否已更改(添加或删除列),这会使您的代码更加动态。当然,这留下了所有值都作为字符导入的问题。

这绝对是个问题,但是我发现按需类型转换变量要容易得多,而不是在输入语句中一个一个地键入每个变量。

如果您将使用宏变量和 %do 循环,请务必将所有代码包含在宏中,否则循环会出错。

我希望这会有所帮助!

【讨论】:

  • 实际上 DSD 选项告诉 SAS 将相邻的分隔符视为缺少值。
【解决方案2】:

除上述cmets外,本行上方的日志行:

错误:导入失败。有关详细信息,请参阅 SAS 日志。

通常包含问题的详细信息。

添加到导入的附加选项是“GUESSINGROWS=MAX;”它告诉 SAS 在确定每列实际是什么之前扫描整个文件(就大小和类型而言)。正如@MrfksIV 在他们的回复中所说,使用数据步通常是最安全的,因为这样你就会确切地知道正在读取什么,这就是我 90% 的时间所做的。

【讨论】:

    【解决方案3】:

    从您的问题中不清楚您希望如何读取文本文件。这里是读取文件每一行作为单独观察的代码。

    data lines;
      infile 'C:\YourFile\here.txt' dlm = '```';
      length line $ 32767;
      input line;
    run;
    

    这可以通过将分隔符设置为您在文件中看不到的字符序列来实现。我连续使用了三个反引号。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多