全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学
10691 10
2009-03-04
<p>碰到如下问题,求教各位大侠:</p><p>文本格式的文件,需要导入到SAS数据集中。原始软件存储如下:不同部分用空行隔开,同一部分需要生成一个数据集,一次生成所有的数据集,另外文本文件中每一部分第一行描述的是变量名称,最后一个要求是数值型变量,前面都是字符型变量,每个数据包含的变量个数事先也是不知道的。</p><p>不知道我说清楚了没。文件格式实例见附件。</p><p>&nbsp;</p>
二维码

扫码加我 拉你入群

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

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

全部回复
2009-3-4 19:01:00
附件在哪?
二维码

扫码加我 拉你入群

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

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

2009-3-4 20:45:00

回复:(xmok77)附件在哪?[em09]

<p>实例文件!</p>
300164.txt
大小:(553 Bytes)

 马上下载

<br/>
二维码

扫码加我 拉你入群

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

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

2009-3-6 22:22:00

回复:[求助]批量将文本文件中数据导入SAS数据集

<p>代码如下:</p><p>===============================================================================================================</p><p>%let g_outfile = "E:\OutFile.csv" ;<br/>%macro CreateTable;</p><p>data record( keep = fieldtype startline endline ) field( keep = field1-field6 fieldtype ) ;<br/>&nbsp; <br/>&nbsp; %local EndBlock;<br/>&nbsp; %let EndBlock = _%substr(%sysfunc(ranuni(0),9.7),3);</p><p>&nbsp; retain startfield startcolumn startline ;<br/>&nbsp; retain readstart 0 ;<br/>&nbsp; retain readfirst 0 ;<br/>&nbsp; retain readfield 0 ;<br/>&nbsp; retain readstat&nbsp; 0 ;<br/>&nbsp; retain startline 0 ;<br/>&nbsp; retain endline&nbsp;&nbsp; 2 ;<br/>&nbsp; retain curline&nbsp;&nbsp; 0 ;<br/>&nbsp; retain fileline&nbsp; 1 ;<br/>&nbsp; infile &amp;g_outfile&nbsp; _infile_= memfile END = endoffile missover dlm = ',' ;<br/>&nbsp; input (field1-field6) ($) ;<br/>&nbsp; fileline+1 ;<br/>&nbsp; curline+1 ;</p><p>&nbsp; if endoffile = 1 then<br/>&nbsp;&nbsp;&nbsp; do ;<br/>&nbsp;&nbsp; endline = curline ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output record ;<br/>&nbsp;&nbsp; goto &amp;EndBlock ;<br/>&nbsp;&nbsp;&nbsp; end ;</p><p>&nbsp; if readstart = 0 then <br/>&nbsp;&nbsp;&nbsp; do ;<br/>&nbsp;&nbsp; readstart = 1 ;<br/>&nbsp;&nbsp; readstat = 1 ;<br/>&nbsp;&nbsp; readfirst = 1 ;<br/>&nbsp;&nbsp; readfield = 0 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fieldtype+1 ;<br/>&nbsp;&nbsp; startline = fileline ;<br/>&nbsp;&nbsp; output field ;<br/>&nbsp;&nbsp; goto &amp;EndBlock ;<br/>&nbsp;end ;</p><p>&nbsp; len = length( memfile )-1 ;<br/>&nbsp; if len = 0 then <br/>&nbsp;&nbsp;&nbsp; do ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readfield = 1 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readstat = 0 ;<br/>&nbsp;&nbsp; endline = curline-1 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; output record ;<br/>&nbsp;&nbsp; if readfirst eq 1 then readfirst = 0 ;<br/>&nbsp;&nbsp; startline = fileline ;<br/>&nbsp;&nbsp; startline+1 ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; goto &amp;EndBlock ;<br/>&nbsp;&nbsp;&nbsp; end ;</p><p>&nbsp; if readfield = 1 then <br/>&nbsp;&nbsp;&nbsp; do ;<br/>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; readfield = 0 ;<br/>&nbsp;&nbsp; readstat = 1 ;<br/>&nbsp;&nbsp; fieldtype+1 ;<br/>&nbsp;&nbsp; output field ;<br/>&nbsp;&nbsp; goto &amp;EndBlock ;<br/>&nbsp;&nbsp;&nbsp; end ;</p><p>&nbsp; if readstat = 1 then goto &amp;EndBlock ;</p><p>&nbsp; &amp;EndBlock.:</p><p>run ;</p><p>proc sort data = record ;<br/>&nbsp; by fieldtype ;<br/>run ;<br/>proc sort data = field ;<br/>&nbsp; by fieldtype ;<br/>run ;</p><p>data mergetable ;<br/>&nbsp; merge field record ;<br/>&nbsp; by fieldtype ;<br/>run ;</p><p>data _null_ ;<br/>&nbsp; set mergetable ;<br/>&nbsp; call symput( "recordcount" , _n_ ) ;<br/>run ;</p><p>%macro appendfield ;<br/>%do i = 1 %to &amp;recordcount ;<br/>&nbsp; %global v&amp;i ;<br/>&nbsp; data _null_ ;<br/>&nbsp;&nbsp;&nbsp;&nbsp; set mergetable ;<br/>&nbsp; if _n_ = &amp;i ;<br/>&nbsp; %do j = 1 %to 6 ;<br/>&nbsp;&nbsp;&nbsp; call symput( "v&amp;j" , field&amp;j ) ;<br/>&nbsp; %end ;<br/>&nbsp; put startline = ;<br/>&nbsp; put recordcnt = ;<br/>&nbsp; call symput( "linestart" , startline ) ;<br/>&nbsp; call symput( "lineend"&nbsp;&nbsp; , endline&nbsp;&nbsp; ) ;<br/>&nbsp;&nbsp; run ;</p><p>&nbsp; data Table&amp;i ;<br/>&nbsp;&nbsp;&nbsp; infile &amp;g_outfile firstobs = &amp;linestart obs = &amp;lineend missover dsd ;<br/>&nbsp;input (&amp;v1 &amp;v2 &amp;v3 &amp;v4 &amp;v5 &amp;v6) ($) ;<br/>&nbsp; run ;</p><p>&nbsp; data Table&amp;i.(drop = count);<br/>&nbsp;&nbsp;&nbsp; set Table&amp;i ;<br/>&nbsp;COUNTCNT = int( count ) ;<br/>&nbsp; run ;</p><p>%end ;<br/>%mend appendfield ;</p><p>%appendfield </p><p>%mend CreateTable ;</p><p>%CreateTable ;</p><p>===============================================================================================================</p><p>遗留问题:</p><p>1、整型变量名要求全部相同(上代码中是COUNT),对变量名不同的问题目前还没有想到好的办法。还请各位大侠看是否有好的点子一同分享;</p><p>2、变量个数最大值要求在一定范围内(这个问题应该不大);</p><br>xmok77
&nbsp;金钱&nbsp;+100
&nbsp;奖励&nbsp;2009-3-7 11:07:41
二维码

扫码加我 拉你入群

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

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

2009-3-7 09:35:00
<p>Try&nbsp;the following code to se if you can&nbsp;find the number of blocks (the number of datasets to be created) and <br/>the number of variables in each block (dataset). These numbers are saved in macro variables: <br/>Num_of_Datasets, NVar_in_Dataset1, NVar_in_Dataset2, ..., and can be used in other macros for input the data.</p><p><br/>data _NULL_;<br/>&nbsp; infile 'D:\MySAS\RawData.txt'; <br/>&nbsp; if _N_ = 1 then Num_block = 1;<br/>&nbsp; retain Num_block Num_var;<br/>&nbsp; input line $80.;<br/>&nbsp; if line = null then Num_block +1;<br/>&nbsp; dataset_name='Dataset'!!trim(left(Num_block));<br/>&nbsp;&nbsp;&nbsp;&nbsp; if line ^= null then Num_var = count(line, ',')+1;<br/>&nbsp; call symput('NVar_in_Dataset'!!trim(left(Num_block)), Num_var);<br/>&nbsp;&nbsp;&nbsp;&nbsp; call symput('Num_of_Datasets', Num_block);<br/>run;<br/>%put _user_; /* to check the number saved in the macro variables */</p><p></p><br>xmok77
&nbsp;金钱&nbsp;+100
&nbsp;奖励&nbsp;2009-3-7 11:08:30
二维码

扫码加我 拉你入群

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

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

2009-3-7 11:09:00
受益匪浅
二维码

扫码加我 拉你入群

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

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

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

说点什么

分享

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