SAS:导入文本文件

时间:2015-04-21 01:26:13

标签: sas

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

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

我收到以下信息:

  

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

3 个答案:

答案 0 :(得分:0)

通常在尝试导入很多不成功后,我决定最好避免使用,因为它有时会产生令人惊讶的结果。

您可以在datastep中使用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-loop,请确保在宏中包含所有代码,否则循环将给出错误。

我希望这有帮助!

答案 1 :(得分:0)

除上述注释外,该行上方的日志行:

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

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

添加到导入的附加选项是“GUESSINGROWS = MAX;”它告诉SAS扫描整个文件,然后再决定每列实际是什么(在大小和类型方面)。当@MrfksIV提出他们的回复时,使用datastep通常是最安全的,因为那时你会确切地知道正在读什么,这就是我90%的时间做的事情。

答案 2 :(得分:0)

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

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

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