由买买提看人间百态

boards

本页内容为未名空间相应帖子的节选和存档,一周内的贴子最多显示50字,超过一周显示500字 访问原贴
Statistics版 - 请教一个SAS数据input的问题
相关主题
[合集] 请教一个SAS数据input的问题用SAS生成CSV 文件
问个SAS 数据读入的问题a quick question importing txt into SAS
请教个有关SAS 的问题修改再问:如何read multiple lines into one record and missing value at the same time in sas
help. txt 读入问题怎么在EXCEL里把一个column的A/B分到两个column里?
[合集] SAS data input help[合集] 请问sas input的一个问题
HELP~~About reading sas data set但谁能解释下truncover 吗?
请教一个SAS 数据读入的问题小包子:怎么读一个文件中的两个不同的delimiters
SAS数据输入疑问sas base (70) problem 59 help
相关话题的讨论汇总
话题: np话题: refid话题: infile话题: dlm话题: sas
进入Statistics版参与讨论
1 (共1页)
f*********8
发帖数: 165
1
id refid
1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2 NP_001135417 /// NP_001604
3 NP_00499494
我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
符号是‘///’。请问应该怎末处理啊?
我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
data new;
infile "C:............" missover dlm="///" ;
input id $ refid $ @;
num=0;
do while (refid ne ' ');
num+1;
output;
input r
t**i
发帖数: 688
2
:$12.
g******h
发帖数: 266
3
我是新手,所以不知道很多语法方面的细节。不过这个问题我的想法是,先用$12.把数
据读出来,然后用substring的办法把多余的///去掉。我现在能想到的是先挑like '*/
'的,再挑 '*//'的,再挑‘*///’的。逐一去掉///的部分。好像记得是用substring
的办法可以选出前多少位的字符串。忘记具体语法了。
你要是能把我的想法用SAS实现,在版上贴一下具体code。共同进步。:)

,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!

【在 f*********8 的大作中提到】
: id refid
: 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
: 2 NP_001135417 /// NP_001604
: 3 NP_00499494
: 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
: 符号是‘///’。请问应该怎末处理啊?
: 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
: data new;
: infile "C:............" missover dlm="///" ;
: input id $ refid $ @;

A*******s
发帖数: 3942
4
comment:
1. dlm="/" SAS默认两个或以上的delimiter为一个
2. :$12. informat 之前加colon,sas会在遇到space和delimiter时停止读入
3. id 4. 这个我不是很确定。如果将id的informat改成$,似乎sas会将后面的空格
和refid一起读入,然后保留前八位再把后面的空格去掉。我不知道怎么解决,只能把
id当做numeric读入就行了。
改了一下,运行好像没错,sample code如下
data new;
infile "**********" missover dlm="/" ;
input id 4. refid :$12. @;
num=0;
do while (refid ne ' ');
num+1;
output;
input refid :$12. @;
end;
run;
proc print;
run

【在 f*********8 的大作中提到】
: id refid
: 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
: 2 NP_001135417 /// NP_001604
: 3 NP_00499494
: 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
: 符号是‘///’。请问应该怎末处理啊?
: 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
: data new;
: infile "C:............" missover dlm="///" ;
: input id $ refid $ @;

P****D
发帖数: 11146
5
这条很有用!学会了。

【在 A*******s 的大作中提到】
: comment:
: 1. dlm="/" SAS默认两个或以上的delimiter为一个
: 2. :$12. informat 之前加colon,sas会在遇到space和delimiter时停止读入
: 3. id 4. 这个我不是很确定。如果将id的informat改成$,似乎sas会将后面的空格
: 和refid一起读入,然后保留前八位再把后面的空格去掉。我不知道怎么解决,只能把
: id当做numeric读入就行了。
: 改了一下,运行好像没错,sample code如下
: data new;
: infile "**********" missover dlm="/" ;
: input id 4. refid :$12. @;

f*********8
发帖数: 165
6
多谢多谢。
我试了这个 id 4.怎末id 都变成 missing 了?!
infile的format 是不是有问题。我的数据存成 .csv
其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进
去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。
能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid
dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。
例如:
id refid
14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2222222222222_b NP_001135417 /// NP_001604
l*********s
发帖数: 5409
7
dlm option shall also include the space character.

refid

【在 f*********8 的大作中提到】
: 多谢多谢。
: 我试了这个 id 4.怎末id 都变成 missing 了?!
: infile的format 是不是有问题。我的数据存成 .csv
: 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进
: 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。
: 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid
: dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。
: 例如:
: id refid
: 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711

A*******s
发帖数: 3942
8
我尝试了一下同时用两个dlm=option,然后把id改成:$16.
dlm='/' dlm=' '
因为源文件格式有点混乱
两个refid之间间隔的,有时候是"/// ", 有时候是" /// "
所以没法读到正确的结果
而且我也搞不明白sas怎么处理两个dlm= option
如果次序不一样,结果也会不一样,有趣。
我还尝试了用 @'NP_' 控制sas读入NP_之后的字符串
好像也不太行,不过结果比较接近,只是第一个refid后面带///
看看大牛们有啥办法处理这种有两种dlm的源文件
你应该打一顿data entry的那个人,太messy了,哈哈

refid

【在 f*********8 的大作中提到】
: 多谢多谢。
: 我试了这个 id 4.怎末id 都变成 missing 了?!
: infile的format 是不是有问题。我的数据存成 .csv
: 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进
: 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。
: 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid
: dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。
: 例如:
: id refid
: 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711

A*******s
发帖数: 3942
9
嗯?我把你贴的sample data存成txt,没问题。
难道是csv的问题?

refid

【在 f*********8 的大作中提到】
: 多谢多谢。
: 我试了这个 id 4.怎末id 都变成 missing 了?!
: infile的format 是不是有问题。我的数据存成 .csv
: 其实真正的id是char type,而且大于8位,就像你说的会把后面的空格和部分refid读进
: 去。我只好用id来简化问题。不过可以用这个数字id map 回原来的id。
: 能否在指教一下,如果id 是char, 大于8位。 id 和refid之间的dlm=" ",但是refid
: dlm='/'有没有办法把两个variable 同时正确读入呢?谢谢。
: 例如:
: id refid
: 14454544_a NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711

D******n
发帖数: 2836
10
data a1;
infile './yourdata' missover;
length refid $ 32;
input id $ refid $ @;
do while (refid ne ' ');
refid=compress(refid,"/");
if (refid ne ' ') then output;
input refid $ @;
end;
run;
proc print ;run;

,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!

【在 f*********8 的大作中提到】
: id refid
: 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
: 2 NP_001135417 /// NP_001604
: 3 NP_00499494
: 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
: 符号是‘///’。请问应该怎末处理啊?
: 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
: data new;
: infile "C:............" missover dlm="///" ;
: input id $ refid $ @;

D******n
发帖数: 2836
11
这种data还好,其实是用错了工具,data cleaning从来就不是SAS该做的东西。用perl
或者其他编程语言都比较好搞。SAS不是不行,而是思维不能很直接。linux 下面可以这
样搞。
sed -e 's/\///g' yourdata.dat | perl -e 'while() {@a=split(" ",$_);$i
d=shift @a;for (@a) {print "$id $_\n"}}'

【在 A*******s 的大作中提到】
: 我尝试了一下同时用两个dlm=option,然后把id改成:$16.
: dlm='/' dlm=' '
: 因为源文件格式有点混乱
: 两个refid之间间隔的,有时候是"/// ", 有时候是" /// "
: 所以没法读到正确的结果
: 而且我也搞不明白sas怎么处理两个dlm= option
: 如果次序不一样,结果也会不一样,有趣。
: 我还尝试了用 @'NP_' 控制sas读入NP_之后的字符串
: 好像也不太行,不过结果比较接近,只是第一个refid后面带///
: 看看大牛们有啥办法处理这种有两种dlm的源文件

y****n
发帖数: 46
12
data temp;
length id refid $12;
infile cards truncover ;
input @;
id=scan(_infile_,1,' ///');
i=2;
do while (scan(_infile_,i,' ///') ne ' ' );
refid=Scan(_infile_,i,' ///');
output;
I=i+1;
end;
keep id refid;
cards;
1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
2 NP_001135417 /// NP_001604
3 NP_00499494
;
run;
d*******1
发帖数: 854
13
先用proc import把csv file 读进去再说。 注意用guessingrows=XXXXXX.
然后再用tranwrd() 和scan() 把相应的record parse出来。

,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!

【在 f*********8 的大作中提到】
: id refid
: 1 NP_001003407/// NP_001003408 /// NP_002304 /// NP_006711
: 2 NP_001135417 /// NP_001604
: 3 NP_00499494
: 我想从一个record生成多个observations, 但是每个record对应的obs个数不等,特殊
: 符号是‘///’。请问应该怎末处理啊?
: 我的问题是打印出来的结果只有8位,但是每个值的长度不是固定的,一旦写成$12.,"/"也被读进去了 (比如说 ‘/// NP_00100’)。 怎末该这个code啊?多谢!
: data new;
: infile "C:............" missover dlm="///" ;
: input id $ refid $ @;

1 (共1页)
进入Statistics版参与讨论
相关主题
sas base (70) problem 59 help[合集] SAS data input help
请教一个SAS读中文数据库的问题HELP~~About reading sas data set
请教个 SAS 读数据的问题请教一个SAS 数据读入的问题
问两个sas的傻问题,怎么知道infile文件的内容呢?SAS数据输入疑问
[合集] 请教一个SAS数据input的问题用SAS生成CSV 文件
问个SAS 数据读入的问题a quick question importing txt into SAS
请教个有关SAS 的问题修改再问:如何read multiple lines into one record and missing value at the same time in sas
help. txt 读入问题怎么在EXCEL里把一个column的A/B分到两个column里?
相关话题的讨论汇总
话题: np话题: refid话题: infile话题: dlm话题: sas