楼主: shj981222
4764 14

[原创博文] 【请教编程】批量读入外部数据 [推广有奖]

  • 0关注
  • 0粉丝

硕士生

98%

还不是VIP/贵宾

-

威望
0
论坛币
17 个
通用积分
0
学术水平
0 点
热心指数
0 点
信用等级
0 点
经验
1863 点
帖子
303
精华
0
在线时间
81 小时
注册时间
2008-1-8
最后登录
2014-5-5

楼主
shj981222 发表于 2008-3-14 14:03:00 |AI写论文

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
<p>怎样编程批量读入外部数据文件,比如:均为txt文件,存放于E盘根目录下,每个文件格式相同且含有10个相同变量和100个观测,共有50个此类文件(文件名不连续:即不是类似从1-100的命名方式),怎样编程把这50个数据文件读入到一个数据集里?请高手指教,谢谢!</p>

[此贴子已经被作者于2008-3-14 14:04:12编辑过]

二维码

扫码加我 拉你入群

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

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

关键词:怎样编程 数据文件 文件格式 命名方式 根目录 怎样编程 命名方式 根目录

回帖推荐

wolfcrying 发表于10楼  查看完整内容

%macro readmultidata(from,to); /*定义一个宏,带两个基本参数*/ %do i = &from. %to &to.;  /*进行循环,从第一个参数执行到最后一个参数*/   data temp;  /*每一次循环都建立一个名为temp的数据集,读入              路径下名为data+当前宏变量的数据*/   infile "d:\abc\def\data&i..csv";   input x; run;/* 在循环的第一步,注意是&i=&from,而不是上 ...

dalu1974 发表于8楼  查看完整内容

第一步:在E盘根目录下键入dir *.txt /b >ex.txt,将50个txt文件名导入文本文件ex.txt中*第二步:生成宏文本文件a.txt,代码如下:;data temp;infile "e:\xw.txt" dlm='.'; input filename $ doc $;file "e:\a.txt";put '%a(' filename ')';run;第三步:编制宏并存入目标文件中data obj;*目标文件名为obj;delete;run;%macro a(f);data &f;infile "e:\&f..txt" ;filename="&f.";input x1-x4;*假设有4个数值型变量;run;data o ...

wolfcrying 发表于3楼  查看完整内容

方法一:SAS 可以支持通配符 *, 适合懒人使用filename abc "d:\abc\def\data*.csv";data base;infile abc;input x;run;proc print;run;方法二:可以使用macro。比较精确,coding复杂一些%macro readmultidata(from,to); %do i = &from. %to &to.;   data temp;   infile "d:\abc\def\data&i..csv";   input x; run; %if &i. = &from. %then %do; data base; set temp; ru ...

本帖被以下文库推荐

沙发
shiningstar111 发表于 2008-3-14 22:51:00
变量相同的话就用merge或者set来把他们连到一起。
merge dataset 1, 2,3,4,5,.....

....


藤椅
wolfcrying 发表于 2008-3-15 02:47:00

方法一:SAS 可以支持通配符 *, 适合懒人使用

filename abc "d:\abc\def\data*.csv";

data base;
infile abc;
input x;
run;
proc print;run;

方法二:可以使用macro。比较精确,coding复杂一些


%macro readmultidata(from,to);
 %do i = &from. %to &to.;
  data temp;
   infile "d:\abc\def\data&i..csv";
   input x;
 run;

 %if &i. = &from. %then %do; data base; set temp; run;%end;
 %else %do; data base;set base temp;%end;

 %end;

%mend;
%readmultidata(1,50)

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 10 精彩帖子

总评分: 经验 + 3  论坛币 + 10   查看全部评分

板凳
zhoukehu 发表于 2008-3-15 12:59:00

put the name in one txt file and data name in another text file and read in for name and run.

the code is simple and u can find it anywhere.

报纸
shj981222 发表于 2008-3-15 13:47:00

多谢指教,特别是wolfcrying朋友接连两次给了详细的解答,不胜感激,之前是考虑可能要用宏来解决,只不过对宏不熟悉(其实宏感觉除了那两个符号之外,其它的也都和sas很多地方的编程没太大区别,不知是否正确),即使现在提供的宏编程,我还要仔细看看以理解。当然也要感谢shiningstar111和zhoukehu两位朋友的解答,再次感谢!

To be rong is fine, but to stay rong is unforgivable.

地板
icepolice 发表于 2008-3-16 13:53:00
wolfcrying,

这一句会把以前的数据集overwrite 掉? 不是吗?thank you!


 %else %do; data base;set base temp;%end;

7
shj981222 发表于 2008-3-17 13:49:00
wolfcrying朋友的编程若加上注释就好了,宏编程还不好理解,初接触
To be rong is fine, but to stay rong is unforgivable.

8
dalu1974 发表于 2008-3-18 00:19:00

第一步:在E盘根目录下键入dir *.txt /b >ex.txt,将50个txt文件名导入文本文件ex.txt中

*第二步:生成宏文本文件a.txt,代码如下:;

data temp;
infile "e:\xw.txt" dlm='.';
input filename $ doc $;
file "e:\a.txt";
put '%a(' filename ')';
run;

第三步:编制宏并存入目标文件中

data obj;*目标文件名为obj;
delete;
run;

%macro a(f);
data &f;
infile "e:\&f..txt" ;
filename="&f.";
input x1-x4;*假设有4个数值型变量;
run;
data obj;
set obj &f.;
run;
%mend a;*以上是定义宏,宏名可以随便起,但要和第二步中的宏文本文件中的宏名保持一致;

*filename="&f."这一句用来识别数据来源,注意这里不能用单引号;

%include "e:\a.txt";*运行宏;
run;

已有 1 人评分论坛币 收起 理由
bakoll + 10 精彩帖子

总评分: 论坛币 + 10   查看全部评分

9
shj981222 发表于 2008-3-18 14:11:00
唉,慢慢研究吧,多谢
To be rong is fine, but to stay rong is unforgivable.

10
wolfcrying 发表于 2008-3-18 17:07:00

%macro readmultidata(from,to); /*定义一个宏,带两个基本参数*/
 %do i = &from. %to &to.;  /*进行循环,从第一个参数执行到最后一个参数*/
 
  data temp;  /*每一次循环都建立一个名为temp的数据集,读入

              路径下名为data+当前宏变量的数据*/
   infile "d:\abc\def\data&i..csv";
   input x;
 run;

/* 在循环的第一步,注意是&i=&from,而不是上面的 i=from ,建立base数据集,注意只在第一步时建立,从第2步开始,每一步都向base追加新生成的temp文件,一直追加到循环的最后一步.*/

 %if &i. = &from. %then %do; data base; set temp; run;%end;
 %else %do; data base;set base temp;%end;

/*也可以把else do 后面的语句改成,

  proc append base=base data=temp ,看得更清楚*/

 %end;

%mend;
%readmultidata(1,50)

调用宏,反复读入50次数据,第1次建立base,随后49次追加到base,明白否?

已有 1 人评分经验 论坛币 收起 理由
bakoll + 3 + 10 精彩帖子

总评分: 经验 + 3  论坛币 + 10   查看全部评分

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

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