如何从 SAS 中的同一文本文件导入具有不同变量的不同数据集
How to import different datasets with differents variables from the same text file in SAS
我有一个包含固定列的大型文本文件,我需要将其导入 SAS。同一文件包含三个级别的信息:公司、关联公司和经济变量。
每个观察值的第一个字符表示行中的值大约是哪个级别(1 是关于公司,2 是关于联营公司...)。根据布局,每一层都有不同长度的不同变量。
这是我必须导入的数据的一个小例子。前 4 个变量是相同的,但之后每个级别都有自己的不同长度的变量。变量 "type" 标识观察的级别。所有其他变量都集中在 "other":
DATA WORK.test;
INFILE DATALINES;
INPUT
type $ 1-1
full_registry $ 2-2
type_update $ 3-3
cnpj $ 4-17
other $ 18-1200
;
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。
您可以在输入语句末尾使用单个尾随 @
来保留当前行,以便在同一数据步骤中进一步输入语句。例如
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 的输入,使用正确的 INPUT 语句。
- 您可能想要添加一些逻辑来跨行保存值,尤其是当您想要保留公司 header 信息时。
您可能还需要考虑是希望所有这些记录都进入同一个数据集还是三个不同的数据集以便稍后管理。
data want;
input @1 type @;
if type = 'A' then
input .......;
else if type='B' then
input ....;
run;
我有一个包含固定列的大型文本文件,我需要将其导入 SAS。同一文件包含三个级别的信息:公司、关联公司和经济变量。
每个观察值的第一个字符表示行中的值大约是哪个级别(1 是关于公司,2 是关于联营公司...)。根据布局,每一层都有不同长度的不同变量。
这是我必须导入的数据的一个小例子。前 4 个变量是相同的,但之后每个级别都有自己的不同长度的变量。变量 "type" 标识观察的级别。所有其他变量都集中在 "other":
DATA WORK.test;
INFILE DATALINES;
INPUT
type $ 1-1
full_registry $ 2-2
type_update $ 3-3
cnpj $ 4-17
other $ 18-1200
;
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。
您可以在输入语句末尾使用单个尾随 @
来保留当前行,以便在同一数据步骤中进一步输入语句。例如
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 的输入,使用正确的 INPUT 语句。
- 您可能想要添加一些逻辑来跨行保存值,尤其是当您想要保留公司 header 信息时。
您可能还需要考虑是希望所有这些记录都进入同一个数据集还是三个不同的数据集以便稍后管理。
data want; input @1 type @; if type = 'A' then input .......; else if type='B' then input ....; run;