楼主: Tigflanker
9256 6

[问答] 求助infile的dlm选项 [推广有奖]

  • 8关注
  • 18粉丝

副教授

49%

还不是VIP/贵宾

-

威望
0
论坛币
2321 个
通用积分
9.9128
学术水平
179 点
热心指数
194 点
信用等级
167 点
经验
27443 点
帖子
622
精华
0
在线时间
851 小时
注册时间
2011-3-27
最后登录
2023-5-14

楼主
Tigflanker 发表于 2014-1-10 15:42:47 |AI写论文
50论坛币
想请问大家一个问题:

我想利用如下代码完成某种宏,
  1. data a;
  2. infile datalines dlm='\t';
  3. input a $ b $ c $ d $ e $ f $ @@;
  4. datalines;
  5. STUDYID(\t)Study Identifier(\t)Char(\t)15(\t) (\t)EG.STUDYID
  6. BRTHDTC(\t)Date/Time of Birth(\t)Char(\t)19(\t)data9.(\t)ADSL.BRTHDTC
  7. AGEGR1(\t)Age Group(\t)Char(\t)15(\t)"<40,
  8. >=40 and < 60,
  9. >= 60"(\t)(\t)ADSL.AGEGR1
  10. AGEGR1N(\t)Age Group (N)(\t)Num(\t)8(\t)(\t)ADSL.AGEGR1N
  11. ;
  12. run;
复制代码

出来的数据集应该是这样的:
abChardef
STUDYID

Study Identifier

Char

15



EG.STUDYID
BRTHDTC

Date/Time  of Birth

Char

19



ADSL.BRTHDTC
AGEGR1

Age  Group

Char

15

<40,
    >=40 and < 60,
    >= 60

ADSL.AGEGR1

AGEGR1N

Age  Group (N)

Num

8



ADSL.AGEGR1N
注:<40,后面是个换行符。
注:datalines中的(\t)代表从excel直接复制过来的转义符。

中间的datalines为每次手动黏贴进去的东西。
现在我想把这些数据读入,其中用来分隔的是excel的分隔符:\t,就是按照\t的转义符一口气读下去。

为什么不直接用import,我有如下苦衷:

因为公司用的是unix sas,故中间有些难弄得东西
1. 据悉proc import不能读入xlsx,这是死穴。
2. 就算能读xlsx,还有一大问题:文件名中可能存在空格,例如:‘/user1/abc/a b  c.xlsx’

所以只好出此下策,加入一个手动环节,然后想用中间的过程步来自动识别读入的数据。

还望给与回复,非常感谢。
祝阅者新年快乐,马上有房有车有房车,还没毕业的就马上有SCI~~

更新:
感觉貌似不行,。。。因为datalines会把制表符直接转换成空格,例如:
input a $1. @@;

  if a = '09'x then input '|' @@;
  else  input a $1. @@;
这样都是没效果的。。

那么,能否通过import的 ‘/user1/abc/a b  c.xlsx’ 解决呢。。。

最佳答案

邓贵大 查看完整内容

(1) you cannot import XLSX files directly because MS XLSX files are XML based. XML is a nested/hierarchical structure that is very hard for importing (which is designed for tabular structures). (2) if you save one XLSX into a tab-delimited flat text file, then you have to save it either in a shared location or move it into UNIX in binary mode (the tabs will become blanks in ASCII mode, thus mess ...
关键词:infile file DLM NFI Identi
Bye SAS.
若有缘,能重聚。

沙发
邓贵大 发表于 2014-1-10 15:42:48
(1) you cannot import XLSX files directly because MS XLSX files are XML based. XML is a nested/hierarchical structure that is very hard for importing (which is designed for tabular structures).
(2) if you save one XLSX into a tab-delimited flat text file, then you have to save it either in a shared location or move it into UNIX in binary mode (the tabs will become blanks in ASCII mode, thus mess up your formatting). An INFILE statement with DLM='09'x and TERMSTR=CRLF should work.
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 Can't more comprehensive than ur said.

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

Be still, my soul: the hour is hastening on
When we shall be forever with the Lord.
When disappointment, grief and fear are gone,
Sorrow forgot, love's purest joys restored.

藤椅
zhengbo8 发表于 2014-1-10 15:55:52
回去试试。
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 谢谢,新年好~

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

板凳
Tigflanker 发表于 2014-1-10 16:20:20
个人感觉有点像这个意思:

infile datalines dlm='prxparse(/\t/)';

如果能有办法把datalines里的内容直接用正则替换也是个办法,但是对于datalines。。。
Bye SAS.
若有缘,能重聚。

报纸
farmman60 发表于 2014-1-13 01:38:48
This code did not completely reach your request. newline should be deleted first.

data a;
infile datalines dlm=','  truncover dsd ;
input @;
_infile_=tranwrd(_infile_,'(\t)',',');
input a $ b :$18. c $ d $ e: $24. f $15.;
datalines;
STUDYID(\t)Study Identifier(\t)Char(\t)15(\t) (\t)EG.STUDYID
BRTHDTC(\t)Date/Time of Birth(\t)Char(\t)19(\t)data9.(\t)ADSL.BRTHDTC
AGEGR1(\t)Age Group(\t)Char(\t)15(\t)"<40,>=40 and < 60,>= 60"(\t)(\t)ADSL.AGEGR1
AGEGR1N(\t)Age Group (N)(\t)Num(\t)8(\t)(\t)ADSL.AGEGR1N
;
run;
已有 1 人评分学术水平 热心指数 信用等级 收起 理由
Tigflanker + 1 + 1 + 1 Thank you~~

总评分: 学术水平 + 1  热心指数 + 1  信用等级 + 1   查看全部评分

地板
Tigflanker 发表于 2014-1-13 09:54:32
farmman60 发表于 2014-1-13 01:38
This code did not completely reach your request. newline should be deleted first.

data a;
Hi farmman,

Thank you to given me powerful support first.
But you just misunderstood my mind.
'(\t)' is not a delimiter which contain '\t' with a pair of brackets.
It's means an invisible mark between two cell, for example, from EXCEL.
When you copy two cells form EXCEL to notepad, it contain a '\t' between two cells.
Bye SAS.
若有缘,能重聚。

7
茶一白山 发表于 2020-11-19 21:28:15
上面的方法可以的,将xlsx的数据复制保存到TXT,然后用下面的语句读取TXT文件
data dlminput;
        infile '/folders/myfolders/exampractice/input/input02.txt' dlm = '09'x;
        input color $ r ;
run;

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

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