在PROC IMPORT中按字符串指定空值

时间:2016-07-13 14:11:54

标签: csv import sas missing-data

我从R来到SAS,这个问题很容易解决。

我正在尝试使用%Macro函数加载一堆CanSim CSV文件(一个example table here)。

%Macro ReadCSV (infile , outfile );
PROC IMPORT 
        DATAFILE= &infile.
        OUT= &outfile.
        DBMS=CSV REPLACE;
 GETNAMES=YES;
 DATAROW=2;
RUN;
%Mend ReadCSV;
%ReadCSV("\\DATA\CanSimTables\02820135-eng.csv", work.cs02820135);
%ReadCSV("\\DATA\CanSimTables\02820158-eng.csv", work.cs02820158);

问题是,只要缺少值,数字Value列就会在所有csv中都有“..”。当IMPORT到达具有此字符串的行时,这会产生错误。

有没有办法告诉IMPORT是否应删除任何“..”或将其视为缺失值? (我发现论坛引用了DSD选项,但这似乎对我没有帮助。)

谢谢!

2 个答案:

答案 0 :(得分:3)

PROC IMPORT只能猜测数据的结构。例如,它可能会看到..并假设该列包含字符串而不是数字。它还可以做出其他可能导致生成的数据集失效的决定。

您可以更好地编写自己的数据步骤代码来读取文件。这不是很难。对于您的示例链接文件,我所做的只是复制并粘贴CSV文件的第一行并删除逗号,使名称成为有效的变量名称,并对字符变量的制作时间进行一些猜测。

data want ;
  infile "&path/&fname" dsd truncover firstobs=2 ;
  length Ref_Date $7 GEO $100 Geographical_classification $20
         CHARACTERISTICS $100 STATISTICS DATATYPE $50 Vector Coordinate $20
         Value 8
  ;
  input (Ref_Date -- Value) (??) ;
run;

??修饰符会告诉SAS在尝试将VALUE列中的文本转换为数字时不报告任何错误。因此文件中的..和其他垃圾会生成缺失值。

答案 1 :(得分:0)

与此问题没有明确相关,但是 - 如果您的问题是" N"或" D"或者你想要丢失的类似的东西,会有一个更简单的解决方案:missing statement(重要的是与missing option不同)。

missing M;

告诉SAS将数据中的单个字符M视为缺失值,并相应地读取它。它将以.M特殊缺失值读取它,其功能类似于.常规缺失(但在等式语句中实际上不相等)。