为什么SAS不能基于逗号分隔符或读取实线正确读取文件

时间:2016-11-27 15:17:37

标签: sas

我的文件如下:

"John","Smith","Blah, John B","1234 N Something St","New Orleans","Orleans","LA",70116,"555-555-5555","666-555-1234","jsmith@maininator.com","http://www.something.com"
"John2","Smith2","Blah2, John2 B","4567 S Blah St","New Orleans2","Orleans2","LA2",70116,"777-555-5555","777-555-1234","jsmith2@maininator.com","http://www.something2.com"

文件非常大,但为了简单起见,我只保留两行。

我的SAS代码是:

data sample;
    infile '/folders/myfolders/samplefile2.csv' dsd dlm="," missover;
    input first_name$ last_name$ company_name$ address$ city$ county$ state$ zip$ phone1$ phone2$ email$ web$;
run;

proc print data=sample;
run;

我得到的输出是:

                  c
                  o
    f             m
    i     l       p
    r     a       a
    s     s       n        a
    t     t       y        d                 c                  p        p
    _     _       _        d                 o      s           h        h        e
    n     n       n        r        c        u      t           o        o        m
O   a     a       a        e        i        n      a    z      n        n        a        w
b   m     m       m        s        t        t      t    i      e        e        i        e
s   e     e       e        s        y        y      e    p      1        2        l        b

1 John  Smith  Blah, Jo 1234 N S New Orle Orleans  LA  70116 555-555- 666-555- jsmith@m http://w

我的问题是为什么我无法正确读取数据或为什么不读第二行?

1 个答案:

答案 0 :(得分:0)

第一个明显的问题是,您通过将前15个字符读入FIRST_NAME变量来忽略分隔符。这将搞乱其余部分。

从分隔文件中读取时,应使用列表样式INPUT语句而不是格式化样式。另外我发现如果我定义我的变量而不是强迫SAS根据我第一次使用它们来猜测我想要的东西,那么我的程序会更加清晰。所以让我们转换你的程序。

data sample;
  infile '/folders/myfolders/samplefile2.csv' dsd dlm="," TRUNCOVER;
  LENGTH first_name $15 last_name $8 company_name $8 
         address $8 city $8 county $8 state $8 zip $8 
         phone1 $8 phone2 $8 email $8 web $8
  ;
  input first_name -- web ;
run;

这也表明你已经定义了许多变量(比如EMAIL和WEB),因为它们太短了它们需要保存的值。

关于第二行问题,很可能是因为行之间没有正确的行尾字符。因为看起来你在Unix上阅读,那可能是因为你的行尾字符是CR(回车或'0D'x)而不是LF(换行或'0A'x)。尝试将TERMSTR=CR添加到INFILE语句中。