楼主: zdl1225
5060 12

[问答] sas导入的CSV数据有换行怎么办? [推广有奖]

  • 0关注
  • 1粉丝

已卖:2份资源

硕士生

8%

还不是VIP/贵宾

-

威望
0
论坛币
450 个
通用积分
10.8609
学术水平
0 点
热心指数
1 点
信用等级
0 点
经验
22452 点
帖子
26
精华
0
在线时间
244 小时
注册时间
2012-7-27
最后登录
2025-12-25

楼主
zdl1225 发表于 2020-3-24 21:34:10 |AI写论文
10论坛币
大家好,我的csv数据如附件 test.zip (725 Bytes) 本附件包括:
  • test.csv
,数据中“地址”这一变量,有很多记录存在换行。
用excel打开数据,地址的换行显示没有问题,但身份证号会变为科学计数而无法正常显示。

我的导入程序:
filename testcsv "E:\test.csv" termstr=CRLF;
proc import
                        out=work.test
                        dbms=csv
                        datafile=testcsv;
        getnames=yes;
        GUESSINGROWS=MAX;
run;

虽然用了termstr=CRLF,但发现只有前10个记录可以解决换行的问题,后面的记录导入还是不正确。
试了好多次,总是不行。
尝试过csv转为xlsx后再导入sas,这样虽然可以解决换行问题,但因excel的问题,导致身份证不能正常导入。
请各位大神帮忙看看,问题出在哪里?谢谢。

最佳答案

l1i2n3i4n5g 查看完整内容

data _null_; infile 'E:\test.csv' recfm=n sharebuffers; file 'E:\test.csv' recfm=n; input a $char1.; retain open 0; /* toggle the open flag */ if a='"' then open=not open; if a='0A'x and open then put ' '; run; filename testcsv "E:\test.csv" termstr=CRLF; proc import out=work.test dbms=csv datafile=testcsv; getnames=yes; GUESSINGROWS=MAX; run;

回帖推荐

l1i2n3i4n5g 发表于2楼  查看完整内容

data _null_; infile 'E:\test.csv' recfm=n sharebuffers; file 'E:\test.csv' recfm=n; input a $char1.; retain open 0; /* toggle the open flag */ if a='"' then open=not open; if a='0A'x and open then put ' '; run; filename testcsv "E:\test.csv" termstr=CRLF; proc import out=work.test dbms=csv datafile=testcsv; getnames=yes; GUESSINGROWS=MAX; run;

沙发
l1i2n3i4n5g 在职认证  发表于 2020-3-24 21:34:11
data _null_;
   infile 'E:\test.csv' recfm=n sharebuffers;
   file 'E:\test.csv' recfm=n;
   input a $char1.;
   retain open 0;
/* toggle the open flag */
   if a='"' then open=not open;
   if a='0A'x and open then put ' ';
run;

filename testcsv "E:\test.csv" termstr=CRLF;
proc import
   out=work.test
   dbms=csv
   datafile=testcsv;
   getnames=yes;
   GUESSINGROWS=MAX;
run;

藤椅
zdl1225 发表于 2020-3-26 11:34:35
请各位大神帮忙看看怎么解决。
自己回复一个{:3_45:}

板凳
jaxlee 发表于 2020-3-27 08:12:21
不用proc import,你有没有试试直接读入数据,

报纸
zdl1225 发表于 2020-3-28 10:33:04
l1i2n3i4n5g 发表于 2020-3-24 21:34
data _null_;
   infile 'E:\test.csv' recfm=n sharebuffers;
   file 'E:\test.csv' recfm=n;
谢谢你!成功了!
就是实际操作数据有1500多个变量,80万条记录,执行过程有些长,只是不知道为啥版本9.4还得这么转一下。
一看到这螃蟹头像,就感觉似曾相识,果然是那个用SAS演奏“我和我的祖国”那个大神!膜拜!膜拜!
刚才不小点了一下“踩”,发现好像还取消不了,如果这个“踩”是不好的意思,还请多多谅解。

地板
Cecilia_Xi 在职认证  发表于 2020-3-29 18:50:52
l1i2n3i4n5g 发表于 2020-3-24 21:34
data _null_;
   infile 'E:\test.csv' recfm=n sharebuffers;
   file 'E:\test.csv' recfm=n;
有几个地方没有理解,诚心请教大神们,烦大神们解答!
1. data _null_步中,如何做到把所有表里的信息都读到a变量中的呢?(是因为只input statement只有a一个变量吗?,若设定两个变量如a $char1. b $char1. ,变量a和b会分别读取什么信息呢?)
2. 为什么csv中address列的变量值会有引号引起来(将data _null_改为data a或其他数据集后看到的)
3. if a='OA'x中的x为什么没有用引号引起来,作用是修饰符吗?
4. open=not open是一个什么用法呢?
5. data _null_这一步是如何在后面的proc import步发挥作用的呢?

7
l1i2n3i4n5g 在职认证  发表于 2020-3-30 10:08:53
zdl1225 发表于 2020-3-28 10:33
谢谢你!成功了!
就是实际操作数据有1500多个变量,80万条记录,执行过程有些长,只是不知道为啥版本9. ...
执行过程需要多长时间?
地址里面,有的是换行(LF),有的是回车换行(CRLF),所以termstr=CRLF无法正确判断完整的一条观测。

8
zdl1225 发表于 2020-3-31 20:45:00
l1i2n3i4n5g 发表于 2020-3-30 10:08
执行过程需要多长时间?
地址里面,有的是换行(LF),有的是回车换行(CRLF),所以termstr=CRLF无法正 ...
嗯,时间是有点长,1小时40分钟,(计算机配置:win10,32G内存,CPU i7-6700),但我还是能接受,毕竟总比导入有错误强。
我试过Python,用这个测试数据导入就没问题,只有sas这样。
我的数据是近80条观测,1300多个变量,具体执行的时间如下:
(NOTE: The data set WORK.TEST has 793411 observations and 1354 variables.)

58   data _null_;
59      infile 'E:\b37a0829-38ed-4b9a-9d5d-ca080d48c8c9.csv' recfm=n sharebuffers;
60      file 'E:\b37a0829-38ed-4b9a-9d5d-ca080d48c8c9.csv' recfm=n;
61      input a $char1.;
62      retain open 0;
63   /* toggle the open flag */
64      if a='"' then open=not open;
65      if a='0A'x and open then put ' ';
66   run;

NOTE: UNBUFFERED is the default with RECFM=N.
NOTE: The file/infile 'E:\b37a0829-38ed-4b9a-9d5d-ca080d48c8c9.csv' is:
      Filename=E:\b37a0829-38ed-4b9a-9d5d-ca080d48c8c9.csv,
      RECFM=N,LRECL=256,File Size (bytes)=1860677420,
      Last Modified=2020年02月19日 20时32分21秒,
      Create Time=2020年03月28日 10时48分16秒

NOTE: UNBUFFERED is the default with RECFM=N.
NOTE: DATA statement used (Total process time):
      real time           1:39:54.34
      cpu time            1:39:48.00

9
zdl1225 发表于 2020-3-31 20:51:46
jaxlee 发表于 2020-3-27 08:12
不用proc import,你有没有试试直接读入数据,
试过列表infile语句导入,但不行。而且真实数据变量太多,不如import省事。

10
windfeild 发表于 2020-4-10 09:19:56
l1i2n3i4n5g 发表于 2020-3-30 10:08
执行过程需要多长时间?
地址里面,有的是换行(LF),有的是回车换行(CRLF),所以termstr=CRLF无法正 ...
搭车问一下,SAS数据集的数据有换行,导出成CSV格式错乱了怎么办?

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注cda
拉您进交流群
GMT+8, 2025-12-29 12:28