楼主: dengwei715
2129 8

[问答] 求教:如何导入数据到已有的表? [推广有奖]

  • 0关注
  • 1粉丝

本科生

78%

还不是VIP/贵宾

-

威望
0
论坛币
29 个
通用积分
0.0004
学术水平
4 点
热心指数
7 点
信用等级
1 点
经验
930 点
帖子
148
精华
0
在线时间
63 小时
注册时间
2008-9-5
最后登录
2018-3-7

相似文件 换一批

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

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

经管之家联合CDA

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

感谢您参与论坛问题回答

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

+2 论坛币
用SAS转眼5年了,突然意识一个极其S.B的问题:关于如何导入数据到一个现有的表。

笔者经常需要从TXT往SAS导入数据,结构都是一样的,每次都需要写几十个informat format input
data  … ;
infile … ;
  informat … ;
  informat … ;
  informat … ;
  …
  format … ;
  format … ;
  format … ;
  …

  input
  …
;
run;


想shi的心, 有木有?


去年接触DB2,发现DB2可以通过


load client from C:\Users\z\Desktop\test.txt of del
  MODIFIED BY CODEPAGE=1208 COLDEL0X09
  MESSAGES  "a:\log\importmsgs.txt"
  insert into test
  ;

这样就不用每次都写一大堆代码去定义字段了。
直接通过  proc sql; create table new like old; quit;
复制一下表结构,再把数据load进这个表不就简单多了?!!

郁闷的是,研究四五天了,百度、Google了无数次,找到的全T MD是proc export相关的,内心崩溃了。。

我大SAS难不成连这么简单的功能都没有吗? 还是我确实没找到?

请大神解惑~



二维码

扫码加我 拉你入群

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

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

关键词:导入数据 informat Modified proc sql messages Desktop import Users 如何

沙发
CTR1013 发表于 2015-6-15 15:09:06 |只看作者 |坛友微信交流群
弱弱的问一下:如果结构是一样的,用的是重复的代码,用宏不可以吗?

使用道具

藤椅
dengwei715 发表于 2015-6-15 15:18:40 |只看作者 |坛友微信交流群
CTR1013 发表于 2015-6-15 15:09
弱弱的问一下:如果结构是一样的,用的是重复的代码,用宏不可以吗?
用宏,也得先运行宏啊!代码还是长。
我现在也是复制粘贴的代码啊,
就是代码长度太长了。
非常不方便

使用道具

板凳
CTR1013 发表于 2015-6-15 15:35:48 |只看作者 |坛友微信交流群
dengwei715 发表于 2015-6-15 15:18
用宏,也得先运行宏啊!代码还是长。
我现在也是复制粘贴的代码啊,
就是代码长度太长了。
不清楚你在什么情况下要做这个工作,不过感觉用宏肯定比复制粘贴方便(即使复制粘贴宏程序也会方便很多),如果你想使主程序简洁可以先将宏另存一个文件再%include,或者先跑好宏放在一个逻辑库里再在options里指定sasmstore=逻辑库里就行了,不用每次跑。仅供参考,不喜勿喷!

使用道具

报纸
dengwei715 发表于 2015-6-15 15:45:35 |只看作者 |坛友微信交流群
CTR1013 发表于 2015-6-15 15:35
不清楚你在什么情况下要做这个工作,不过感觉用宏肯定比复制粘贴方便(即使复制粘贴宏程序也会方便很多) ...
谢谢,也是一个办法吧。  
不过,还是想求教下大神们,难道就没有类似DB2的LOAD INTO 之类的方法吗?

使用道具

地板
dengwei715 发表于 2015-6-16 09:15:44 |只看作者 |坛友微信交流群
继续呼唤大神

使用道具

7
yongyitian 发表于 2015-6-16 09:51:29 |只看作者 |坛友微信交流群
  1. /* Try this */

  2. data class;
  3. file "C:\Temp\myclass.txt";
  4.     set sashelp.class;
  5.       informat name $10.;   format name $10.;
  6.       informat sex $1.;     format sex $1.;
  7.       informat age 8.;      format age 8.;
  8.       informat weight 8.;   format weight 8.;
  9.       informat height 8.;   format height 8.;
  10.     put @1 name @15 sex @20 age  @30 weight @40 height;
  11. run;

  12. proc contents data=class; run;

  13. %let in_put= input name sex age weight height;

  14. data myclass;
  15.    if 0 then set class;
  16.    infile  "C:\Temp\myclass.txt";
  17.    &in_put;
  18. run;

  19. proc contents data=myclass; run;
复制代码

Input.GIF (6.96 KB)

Input.GIF

使用道具

8
dengwei715 发表于 2015-6-16 16:34:00 |只看作者 |坛友微信交流群
yongyitian 发表于 2015-6-16 09:51
非常感谢。
虽然您的代码不能直接运行,但我大概理解了您的意思:
1、通过 proc contents data=data_old out=test_content noprint; run; 获取表的基本信息;
2、 proc sort data=test_content; by VARNUM; run;  按字段序号排序;
3、 在EXCEL中打开test_content,把字段名粘出来;
4、 %let in_put= input  VAR1 VAR2 VAR3……;
5、 data data_new;
      if 0 then set data_old;
      infile ".txt""  dsd missover dlm='' firstobs=1;
      &in_put;
run;

已经很方便的解决了我的需求,但还有一点疑问,获取到变量列表,除了手工复制粘贴,能不能直接
通过代码对 %let in_put= input  VAR1 VAR2 VAR3……; 进行赋值?

再次表示感谢

使用道具

9
yongyitian 发表于 2015-6-16 21:24:29 |只看作者 |坛友微信交流群
dengwei715 发表于 2015-6-16 16:34
非常感谢。
虽然您的代码不能直接运行,但我大概理解了您的意思:
1、通过 proc contents data=data_ol ...
proc sql noprint;
    select name into :varlist separated by ' '
    from dictionary.columns
    where libname='SASHELP' and memname='CLASS';   /* 注意大写 */
quit;

%put &varlist;

使用道具

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

本版微信群
加好友,备注cda
拉您进交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-26 17:03