首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从SAS中的相同文本文件导入不同变量的不同数据集

如何从SAS中的相同文本文件导入不同变量的不同数据集
EN

Stack Overflow用户
提问于 2018-12-18 16:17:55
回答 2查看 95关注 0票数 0

我有一个包含固定列的大型文本文件,需要导入到SAS中。同一文件包含三个层次的信息:公司、员工和经济变量。

每个观察的第一个字符显示行中值的大小(1是关于公司的,2是关于关联的.)。根据布局,每个层次都有不同长度的变量。

这是我必须导入的数据的一个小例子。前4个变量是相同的,但之后每个级别都有自己的变量,具有不同的长度。变量"type“标识观察所涉及的级别。所有其他变量都被组合成“其他”:

代码语言:javascript
复制
DATA WORK.test;
INFILE DATALINES;
INPUT
    type $ 1-1
    full_registry $ 2-2
type_update $ 3-3
cnpj $ 4-17
other $ 18-1200

代码语言:javascript
复制
DATALINES;
1F 000000000001911BANCO DO BRASIL SA     DIRECAO GERAL        022005110300                                                                                                                                                                 
2F 000000000001912MARCIO HAMILTON FERREIRA    000***923641**100000020101117                                                                                       
2F 000000000001912NILSON MARTINIANO MOREIRA   000***491386**100000020101117                                                                                                                          
2F 000000000001912WALTER MALIENI JUNIOR       000***718468**100000020101117                                                                                                                          
2F 000000000001912PAULO ROGERIO CAFFARELLI    000***415907**100000020120327                                                                                                                          
2F 000000000001912ADRIANO MEIRA RICCI         000***295868**100000020180412                                                                                                                          
2F 000000000001912MARCOS RENATO COLTRI        000***890627**100000020180418                                                                                                                           
2F 000000000001912CARLA NESI                  000***370266**100000020170614                                                                                                                           
6F 000000000001916499999                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
1F 000000000002722BANCO DO BRASIL SA     MANAUS (AM)          022005110300                                                                                                                        
1F 000000000003532BANCO DO BRASIL SA     SANTOS - SANTOS (SP) 022005110300                                                                                                                              
1F 000000000004342BANCO DO BRASIL SA     CAMPOS EST.UNIF.     022005110300                                                                                                                          
1F 000000000005152BANCO DO BRASIL SA     MACAPA-EST.UNIF.     022005110300                                                                                                                          
;;;;
run;

读这个文件最好的方法是什么?

我想到了两种可能性:

一、阅读三遍txt,每个层次有三个布局。把读错的观察结果扔掉。我不确定这能不能成功。

读取前4个变量,并将行的其余部分放在字符串变量上,就像我在本例中所做的那样。然后使用一堆substr()来分隔这几个变量。我不确定这是不是最聪明的方法。

我错过了一种更简单的方法吗?

我使用的是企业版7.13。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-12-18 16:38:58

您可以使用输入语句末尾的单个尾尾@来保持当前行,以便在同一数据步骤中进行进一步的输入语句。例如。

代码语言:javascript
复制
DATA want;
INFILE DATALINES;
/*Always input the first 4 variables*/
INPUT type $ 1-1 full_registry $ 2-2 type_update $ 3-3 cnpj $ 4-17 @;
select(type);
when('1') input var1; /*fill this in with input rules for type 1 records*/
when('2') input var2; /*fill this in with input rules for type 2 records*/
otherwise input; /*do not input any other variables - just ignore the row*/
end;
DATALINES;
1F 000000000001911BANCO DO BRASIL SA     DIRECAO GERAL        022005110300                                                                                                                                                                 
2F 000000000001912MARCIO HAMILTON FERREIRA    000***923641**100000020101117                                                                                       
2F 000000000001912NILSON MARTINIANO MOREIRA   000***491386**100000020101117                                                                                                                          
2F 000000000001912WALTER MALIENI JUNIOR       000***718468**100000020101117                                                                                                                          
2F 000000000001912PAULO ROGERIO CAFFARELLI    000***415907**100000020120327                                                                                                                          
2F 000000000001912ADRIANO MEIRA RICCI         000***295868**100000020180412                                                                                                                          
2F 000000000001912MARCOS RENATO COLTRI        000***890627**100000020180418                                                                                                                           
2F 000000000001912CARLA NESI                  000***370266**100000020170614                                                                                                                           
6F 000000000001916499999                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      
1F 000000000002722BANCO DO BRASIL SA     MANAUS (AM)          022005110300                                                                                                                        
1F 000000000003532BANCO DO BRASIL SA     SANTOS - SANTOS (SP) 022005110300                                                                                                                              
1F 000000000004342BANCO DO BRASIL SA     CAMPOS EST.UNIF.     022005110300                                                                                                                          
1F 000000000005152BANCO DO BRASIL SA     MACAPA-EST.UNIF.     022005110300                                                                                                                          
;;;;
run;
票数 1
EN

Stack Overflow用户

发布于 2018-12-19 00:13:01

  1. 读第一字符
  2. 为每种记录类型创建输入语句
  3. 使用来自#1的输入,使用正确的输入语句。
  4. 您可能需要添加一些逻辑来保存跨行的值,特别是如果要保留公司标题信息的话。
  5. 您还可能需要考虑是否希望将所有这些记录转到相同的数据集,或者您以后可以管理的三个不同的数据集;输入@1类型@;如果类型= 'A‘然后输入.;如果类型=’B‘然后输入.;运行;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53837128

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档