在SAS

时间:2016-02-11 14:54:14

标签: sas

我在SAS目录上有大约27,000个.csv文件,这些文件也被复制到网络驱动器上,所以我可以选择使用它们。

我需要将所有csv文件合并到一个数据集中并删除所有空行(空行在A列中包含逗号)。

每个CSV文件都有一个唯一的名称,但结构和格式相同。

在最终数据集中......我希望A列包含文件名,数据从导入文件范围A1:向下复制到S1:向下到B到T列。

我尝试使用以下代码,但在大约1,000个文件后失败:

x 'cd C:\temp';

filename csv ('*.csv');

proc import out=work.LSPImportFiles
datafile = csv DBMS=CSV REPLACE;
GETNAMES=yes;
run;

我也尝试了下面的代码,但这似乎错过了第8列和第9列,并在几百之后失败了:

data want;
    length _filename_ $32;
    infile C:\temp\*.csv" dlm = ',' filename = _filename_;
    input @;
    if _filename_ ne lag1(_filename_) then delete;
input
Column_1    :$15.
Column_2    :$16.
Column_3    /*this is a number to 2 decimal places*/
Column_4    /*this is a number to 2 decimal places*/
Column_5    /*this is a number to 2 decimal places*/
Column_6    /*this is a number to 2 decimal places*/
Column_7    /*this is a number to 2 decimal places*/
Column_8    /*this is a percentage*/
Column_9    /*this is a percentage*/
Column_10   /*this is a number to 2 decimal places*/
Column_11   /*this is a number to 2 decimal places*/
Column_12   /*this is a number to 2 decimal places*/
Column_13   /*this is a number to 2 decimal places*/
Column_14   /*this is a blank column*/
Column_15   /*this is a number to 2 decimal places*/
Column_16   /*this is a number to 2 decimal places*/
Column_17   /*this is a number to 2 decimal places*/
run;

1 个答案:

答案 0 :(得分:1)

您需要为名称定义两个变量,因为INFILE语句中引用的变量会自动删除。如果您有一个真正的CSV文件,那么您将需要使用DSD选项来正确处理空字段,特别是因为您似乎表明至少有一列是空的。最好明确定义变量,而不是根据您指定的类型格式或使用的信息进行SAS猜测。如果一条线的字段少于预期,最好使用TRUNCOVER选项来避免SAS跳转到下一行。

data want;
  length _filename_ filename $32 Column_1 $15 Column_2 $16  Column_3-Column_17 8;
  infile "C:\temp\*.csv" dsd dlm = ',' filename = _filename_ truncover;
  input @;
  if _filename_ ne lag1(_filename_) then delete;
  input Column_1 - Column_17 ;
  filename=_filename_;
run;

根据CSV文件中百分比的编码方式,您可能需要添加此语句,以便SAS接受10%之类的值。

  informat column_8 column_9 percent. ;

您可以将所需的任何其他处理添加到数据步骤。例如,要删除第一列为空的行(我假设您的意思是说A列包含逗号),您可以在run语句之前添加此行。

 if missing(column_1) then delete;