【问题标题】:SAS Import from .CSV with line break使用换行符从 .CSV 导入 SAS
【发布时间】:2014-04-28 09:30:33
【问题描述】:

我有带有换行符的 .csv 文件并想导入到 SAS,但我面临着数据的问题,比如 CUSTOMER 有空格(换行文本)。请帮助我如何克服这个问题,类似的方式我还有一些其他变量,如果我手动导入它的工作正常。请找到下面的示例。查看 SLN PJ0136 了解问题。

SLN     MOD PM  NE      CUSTOMER
32121   GG  1   1   AVAILABLE UPON REQUEST
71403   EN  1   0   JET SUPPORT SERVICE INC.
305173  EN  1   1   UNKNOWN / COTTONWOOD, LLC / J SUPPORT SERVICE, INC.
PJ0136  PS  0   0   "UNKNOWN / GROUP B-50 INC AA
                    TC0004   anada CSC Europe
                    Inglewood Ava" 
EB0162  RG  0   0   ATR

我用infile来导入

DATA WORK.test1;
%let _EFIERR_ = 0; 
INFILE 'C:\Users\26631.IELPWC\Downloads\test.csv'
       delimiter = ',' MISSOVER DSD lrecl=32767 firstobs=2 ;

    INFORMAT
        SLN  $CHAR6. MOD $CHAR2. PM  BEST1.  NE BEST1. CUSTOMER $CHAR82. ;
    FORMAT
        SLN  $CHAR6.  MOD  $CHAR2. PM  BEST1.  NE   BEST1. CUSTOMER  $CHAR82. ;
    INPUT
        SLN $  MOD $  PM NE CUSTOMER $ ;

   if _ERROR_ then call symputx('_EFIERR_',1);
RUN;

请查看错误的输出

32121   GG  1   1   AVAILABLE UPON REQUEST
71403   EN  1   0   JET SUPPORT SERVICE INC.
305173  EN  1   1   UNKNOWN / COTTONWOOD, LLC / J SUPPORT SERVICE, INC.
PJ0136  PS  0   0   "UNKNOWN / GROUP B-50 INC AA
TC0004      .   .   
24719       .   .   
"       .   .   
EB0162  RG  0   0   ATR

【问题讨论】:

  • 我不知道“如果我手动导入可以正常工作”是什么意思。您使用的是PROC IMPORT,导入向导还是别的什么?
  • 乔是的,通过使用导入向导

标签: sas


【解决方案1】:

假设你的输入数据格式如下:

SLN,MOD,PM,NE,CUSTOMER
32121,GG,1,1,AVAILABLE UPON REQUEST
71403,EN,1,0,JET SUPPORT SERVICE INC.
305173,EN,1,1,"UNKNOWN / COTTONWOOD, LLC / J SUPPORT SERVICE, INC."
PJ0136,PS,0,0,"UNKNOWN / GROUP B-50 INC AA
TC0004   anada CSC Europe
Inglewood Ava"
EB0162,RG,0,0,ATR

以下 SAS 代码将产生所需的输出:

data TEST (drop=_TMP_:);
  format SLN $6. MOD $2. PM 8. NE 8. CUSTOMER $82. _TMP_STR $100.;
  infile 'input.csv' truncover firstobs=2 dlm=',' dsd lrecl=10000;
  input SLN MOD PM NE _TMP_STR @;
  _TMP_COUNT=0;
  do until(mod(_TMP_COUNT, 2) = 0);
    CUSTOMER=catx('0A'x, CUSTOMER, _TMP_STR);
    _TMP_COUNT=_TMP_COUNT + countc(_TMP_STR, '"');
    if mod(_TMP_COUNT, 2) then do;
      input _TMP_STR;
    end;
  end;
  CUSTOMER=dequote(CUSTOMER);
run;

请注意 CUSTOMER 列的值,其中SLN='PJ0136' 是多行(Unix 样式)。您可以通过更改函数catx(...) 来删除它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-22
    • 1970-01-01
    • 2021-11-19
    • 1970-01-01
    • 1970-01-01
    • 2012-01-26
    相关资源
    最近更新 更多