导入的代码有什么问题?我正在尝试将文本文件导入SAS。
proc import DATAFILE="C:\Users\Tiffany\Documents\Inpatientaveragelengthofstaysince2009.txt"
out=Indivs dbms=dlm replace;
delimiter=' ';
getnames=yes;
run;
我收到以下信息:
错误:导入失败。有关详细信息,请参阅SAS日志。
答案 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;
这可以通过将分隔符设置为您在文件中看不到的字符序列来实现。我连续使用了三个后面的刻度线。