我试图弄清楚如何读取用逗号分隔的文本文件(300mb)中的数据,但数据在一行中。
数据如下所示:
A,B,C,d,E,F,G,H,I,J,K,L,M,FALSE,FALSE,真实,1,379,0,1,1,1,1,1, 1,0,1,0,6,0,6,0,6,6,6,6,6,6,6,6,6,0,6,0,0,0,0,0,0, 0
这里A到M的数据是变量名,rest是这些变量的数据。谁能帮我把这些数据读进SAS?
非常感谢!
答案 0 :(得分:6)
你最好的选择是用两遍来读它:一个行分界步骤和一个读取步骤。
我建议首先使用TERMSTR =“,”作为行,这样你就拥有了一个包含一个字段的大量行。然后找出你的行应该终止的位置,并将其转换为一行,输出到一个带有普通for-os行终止符的文件。
然后你可以用正常的读取方法阅读它。
例如,假设我有一行文件:
A,B,C,d,E,F,1,2,3,4,5,6,7,8,9,10,11,12
然后我可以这样读它。
filename oneline "c:\temp\oneline.csv";
filename intermed temp;
%let numfields=6;
data _null_;
infile oneline termstr=",";
file intermed dlm=',';
do _i = 1 to &numfields;
input line $;
putlog line;
put line @;
end;
put;
run;
data want;
infile intermed dlm=',' firstobs=2;
input a b c d e f;
run;
您还可以添加一些代码来解析第一行并将其放在宏变量或包含文件中,然后在后面的数据步骤中使用该文件生成input
行,但我将其保留为为读者锻炼。
答案 1 :(得分:1)
您可以在输入语句中使用双尾@
,例如
data example;
input a b @@;
infile cards dlm=',';
cards;
1,2,3,4,5,6
;
run;
这可能会在尝试读取列标题时导致一些错误,但对于后续迭代应该没问题。
要解决与lrecl相关的崩溃问题,您可以在将文件导入SAS之前使用外部实用程序(例如GNU sed)替换带换行符的逗号,然后编写一个输入语句,从转换后的文件中读取多行填写每条记录。
答案 2 :(得分:1)
为什么不这样简单:
DATA test;
INFILE 'your_huge_file.csv' DSD;
INPUT a $ b $ c $ d $ e $ f $ g $ h $ i $ j $ k $ l $ m @@;
IF a = 'a' THEN DELETE; * This will exclude the "headers"
RUN;
答案 3 :(得分:0)
您可以从文件中删除变量名称(a,b ... m)并执行以下操作:
数据a; infile' C \ example.txt' DLM =',' dsd; 输入$ b $ c $ d $ e $ f $ g $ h $ i $ j $ k $ l $ m $ @@; 运行;
@@将确保它继续阅读,并且一旦读取了最后一个变量的值(m)就不会进入下一行