如何导入带分隔符的CSV文件为";" 和小数分隔符","进入SAS?

Joz*_*Joz 6 csv sas decimalformat

我已经(并将在未来收到)许多CSV文件,这些文件使用分号作为分隔符,逗号作为小数分隔符.到目前为止,我无法找到如何使用proc导入将这些文件导入SAS - 或以任何其他自动方式导入,而无需手动处理变量名称.

创建一些示例数据:

%let filename = %sysfunc(pathname(work))\sap.csv;

data _null_;
  file "&filename";
  put 'a;b';
  put '12345,11;67890,66';
run;
Run Code Online (Sandbox Code Playgroud)

导入代码:

proc import out = sap01 
datafile= "&filename"
dbms = dlm; 
delimiter = ";";
GETNAMES = YES; 
run;
Run Code Online (Sandbox Code Playgroud)

导入后,变量"AMOUNT"的值,例如350,58(相当于美国格式的350.58)在SAS中看起来像35,058(意思是三十五......)(并且在重新导出到德国EXCEL之后看起来像35.058,00).一个简单但又脏的解决方法如下:

data sap02; set sap01;
AMOUNT = AMOUNT/100;
format AMOUNT best15.2;
run;
Run Code Online (Sandbox Code Playgroud)

我想知道是否有一种简单的方法来定义CVS-import的小数分隔符(类似于分隔符的规范)...或任何其他"清洁"解决方案与我的解决方法相比.提前谢谢了!

Joe*_*Joe 6

你应该在技术上使用dbms=dlmdbms=csv,尽管它理出头绪.CSV表示"逗号分隔值",而DLM表示"分隔",这在此是正确的.

我认为有一种直接的方法可以让SAS通过逗号来读入PROC IMPORT.在读取数据时,您需要告诉SAS使用NUMXw.d信息,我没有办法在SAS中强制设置该设置.(有一个用逗号输出的选项NLDECSEPARATOR,但我认为这不适用.)

最好的办法是自己编写数据步骤代码,或者运行PROC IMPORT,转到日志,然后将读入的代码复制/粘贴到程序中; 然后为每个读入记录添加:NUMX10.或者适当的最大字段宽度.它最终会看起来像这样:

data want;
  infile "whatever.txt" dlm=';' lrecl=32767 missover;
  input
    firstnumvar :NUMX10.
    secondnumvar :NUMX10.
    thirdnumvar :NUMX10.
    fourthnumvar :NUMX10.
    charvar :$15.
    charvar2 :$15.
  ;
run;
Run Code Online (Sandbox Code Playgroud)

它还会生成大量的信息和格式代码; 您可以交替转换信息,NUMX10.BEST.不是将信息添加到读入.您也可以删除信息,除非您有日期字段.

data want;
  infile "whatever.txt" dlm=';' lrecl=32767 missover;
  informat firstnumvar secondnumvar thirdnumvar fourthnumvar NUMX10.;
  informat charvar $15.;
  format  firstnumvar secondnumvar thirdnumvar fourthnumvar BEST12.;
  format charvar $15.;
  input
    firstnumvar
    secondnumvar
    thirdnumvar
    fourthnumvar
    charvar $
  ;
run;
Run Code Online (Sandbox Code Playgroud)