全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4001 12
2014-10-23
悬赏 200 个论坛币 已解决
学习了这个帖子https://bbs.pinggu.org/thread-1572362-1-1.html,但还有点不会
这是我的代码:
filename indata pipe "dir c:\*.csv/b";
data vname;                        
length fname $20.;
infile indata truncover;
input fname $20.;
call symput('nvars',_n_);
run;
%macro want;
%do i=1 %to &nvars ;
  data _null_;
   set vname;
   if _n_=&i;
   call symput('file',fname);
  run;
  data tmp;
    infile "c:\&file" firstobs=2 delimiter=',';
    input x y;
  run;
  proc datasets noprint;  
        append base=want data=tmp;
  quit;
%end;
%mend;
%want
quit;

我想实现:
1.不同的csv文件输入到以它名字命名的数据集中
2.输到一个数据集中,但添加一个分类变量:type,值等于数据集名字。

请各位指教。

最佳答案

sniperhgy 查看完整内容

嗯,这几点的意思分别是: 1. 用if _n_ = &i.;会导致set被执行多次,只有到了&i.的时候,值才会保留,而且即使已经去到了&i.,set也会去读取下面的行,这样比较浪费资源,如果用firstobs和obs选项,那么只会读取一次数据,这对于数据量比较大的时候,优势比较明显。 2.proc import: 2.1dbms是SAS外接其他数据的接口,而delimiter是分隔符,当dbms = dlm的时候,delimiter才会发生作用,也就是自定义分隔符,比如楼主遇到 ...
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2014-10-23 19:30:11
augustin4 发表于 2014-10-24 16:04
我还是有些问题不太明白:
关于第一段代码:
1.第13行这么做和
嗯,这几点的意思分别是:
1. 用if _n_ = &i.;会导致set被执行多次,只有到了&i.的时候,值才会保留,而且即使已经去到了&i.,set也会去读取下面的行,这样比较浪费资源,如果用firstobs和obs选项,那么只会读取一次数据,这对于数据量比较大的时候,优势比较明显。

2.proc import:
  2.1dbms是SAS外接其他数据的接口,而delimiter是分隔符,当dbms = dlm的时候,delimiter才会发生作用,也就是自定义分隔符,比如楼主遇到一个文本文件,里面都是用|分割的,那么delimiter = ‘|’,如果遇到用tab符分割的,delimiter = '09'x。至于dbms = csv,这句话,其实已经暗含了delimiter = ‘,’这句,就不需要楼主自己写了。

  2.2 guessingrows的作用就是判断变量类型和长度的,一般我都设置成32676,要是万一以后的数据出现不一样的情况,那就需要自己改成MAX(也可以写2147483647)了。所以我也推荐楼主这么设置,不是很费资源,所以不用担心运行效率的问题。

  2.3 datarow这个选项,和getnames有一定关系,如果getnames=YES,那么datarow不写的话值就为2,如果写了,那么就按照写的值读取;如果getnames=NO,datarow不写就是1,写了的话,按照写了的值

  2.4 replace这个也是个习惯,可以不加。

  2.5 导入excel不成功:那是因为excel引擎不支持guessingrows选项,也不需要,遇到excel文件,import会根据全部变量来设置变量的类型和长度,不用担心会被截取,所以只要将guessingrows去掉就好了。guessingrows用到普通的文本文件。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-24 10:46:04
楼主你好,我又来了,对于问题一,其实用import会比较简单一点,因为是csv文件,格式是都好分割,不需要自己写data部,代码如下:
复制代码
但有一点要注意,就是那些csv文件的名字,不能有空格,否则SAS会出错,还有就是不能以数字开头,一定是字母或者下划线,否则SAS会认为那是无效的数据集名字。

第二个问题和第一个问题的思路是一样的,都是先读入,然后append到一起,代码如下:
复制代码
但是要append到一起,限制就比较多,首先,要求那些csv文件的layout是一样的,也就是列名和顺序都一样,还有,变量的长度要确保一致,否则会出现trunc的情况,还有就是需要先制作一个空的数据集want,里面的layout要和外面的csv一致,还得有一个type列,楼主可以自己试试看,我这里已经试验成功了。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-24 16:04:10
sniperhgy 发表于 2014-10-24 10:46
楼主你好,我又来了,对于问题一,其实用import会比较简单一点,因为是csv文件,格式是都好分割,不 ...
我还是有些问题不太明白:
关于第一段代码:
1.第13行这么做和
if _n_=&i;
   call symput('file',fname); 有什么区别?
2.我对proc import不太了解:
2.1 dbm和delimiter有什么区别?它的缺省值是csv还是dlm?dlm的意思是不是由delimiter定义划分?
2.2 guessingrows是不是用来判断变量的类型? 它的值应该i怎么设?
2.3 datarow这里没有给出,是不是缺省值是2?
2.4 以csv文件名命名的数据集本来就是第一次输入,是不是不用加replace?
2.4 我想干脆输入excel数据, 首先,这样成功了:(后缀xlsx)
复制代码
但我把原来的程序改成这样就报错了:(后缀改成xlsx, dbms改为excel, substr改成截取5位)
复制代码
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-24 16:13:34
sniperhgy 发表于 2014-10-24 10:46
楼主你好,我又来了,对于问题一,其实用import会比较简单一点,因为是csv文件,格式是都好分割,不 ...
关于第二段代码,出了点问题:
我拿我c盘里的两个csv文件进行测试:
kkkkkeee.csv
hoh.csv
kkkkkeee.csv:
x        y
2        34
2        3
3        12
7        3
43        5
6        1
3        2

hoh.csv:
x        y
2        4
21        43
4        4
6        1
45        3
2        5
21        1

都是随便输的。
代码几乎没有改动:
复制代码
在给type赋值的data步之前没有任何问题,但之后
两个数据集中不但多了type变量,还多了一个叫kkkkkeee的变量,且两个变量都没有赋值。

最后日志是这样的:
NOTE: 由调用宏“WANT”生成行。
2      32676;       getname = YES;     run;
                    -------
                    1

WARNING 1-322: 假定符号 GETNAMES 被错拼为 getname。

ERROR: 文件正在使用中,c:\hoh.csv。
ERROR: 导入失败。详细信息,请参阅“SAS 日志”。
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE IMPORT”所用时间(总处理时间):
      实际时间          0.15 秒
      CPU 时间          0.15 秒



ERROR: 文件“WORK.HOH.DATA”不存在。

NOTE: 由于出错,SAS 系统停止处理该步。
WARNING: 数据集 WORK.HOH 可能不完整。该步停止时,共有 0 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.03 秒
      CPU 时间          0.03 秒



NOTE: 正在追加 WORK.HOH 至 WORK.WANT。
WARNING: 变量 hoh 在 BASE 文件中未找到。变量将不能添加到 BASE 文件。
WARNING: 变量 x 在 DATA 文件中没有找到。
WARNING: 变量 y 在 DATA 文件中没有找到。
ERROR: 由于上面所列的异常,没有完成追加。 请用 FORCE 选项追加这些文件。
NOTE: 添加了 0 个观测。
NOTE: 数据集 WORK.WANT 有 0 个观测和 3 个变量。
NOTE: 由于上述错误,没有处理语句。
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE DATASETS”所用时间(总处理时间):
      实际时间          0.03 秒
      CPU 时间          0.03 秒




NOTE: 从数据集 WORK.VNAME. 读取了 1 个观测
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.00 秒
      CPU 时间          0.00 秒


NOTE: 由调用宏“WANT”生成行。
6      32676;       getname = YES;     run;
                    -------
                    1

WARNING 1-322: 假定符号 GETNAMES 被错拼为 getname。

ERROR: 文件正在使用中,c:\kkkkkeee.csv。
ERROR: 导入失败。详细信息,请参阅“SAS 日志”。
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE IMPORT”所用时间(总处理时间):
      实际时间          0.17 秒
      CPU 时间          0.17 秒



ERROR: 文件“WORK.KKKKKEEE.DATA”不存在。

NOTE: 由于出错,SAS 系统停止处理该步。
WARNING: 数据集 WORK.KKKKKEEE 可能不完整。该步停止时,共有 0 个观测和 2 个变量。
NOTE: “DATA 语句”所用时间(总处理时间):
      实际时间          0.01 秒
      CPU 时间          0.01 秒



NOTE: 正在追加 WORK.KKKKKEEE 至 WORK.WANT。
WARNING: 变量 kkkkkeee 在 BASE 文件中未找到。变量将不能添加到 BASE 文件。
WARNING: 变量 x 在 DATA 文件中没有找到。
WARNING: 变量 y 在 DATA 文件中没有找到。
ERROR: 由于上面所列的异常,没有完成追加。 请用 FORCE 选项追加这些文件。
NOTE: 添加了 0 个观测。
NOTE: 数据集 WORK.WANT 有 0 个观测和 3 个变量。
NOTE: 由于上述错误,没有处理语句。
NOTE: 由于出错,SAS 系统停止处理该步。
NOTE: “PROCEDURE DATASETS”所用时间(总处理时间):
      实际时间          0.03 秒
      CPU 时间          0.03 秒
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2014-10-24 17:49:36
augustin4 发表于 2014-10-24 16:13
关于第二段代码,出了点问题:
我拿我c盘里的两个csv文件进行测试:
kkkkkeee.csv
不好意思啊,代码里面有两处错误的地方
复制代码
这个代码在我这里可以正常运行。
二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群