Import 在SAS中导入txt文件

Import 在SAS中导入txt文件,import,sas,txt,Import,Sas,Txt,我尝试使用以下代码在sas中导入文本文件 PROC IMPORT DATAFILE= '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' OUT= outdata DBMS=dlm REPLACE; delimiter='09'x; GETNAMES=YES; RUN; 但导入失败,因为文本文件有丢失数据的周期 这是我在SASlog中得到的 NOTE: Invalid data for class_siz

我尝试使用以下代码在
sas
中导入文本文件

PROC IMPORT DATAFILE= '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
OUT= outdata 
DBMS=dlm 
REPLACE; 
delimiter='09'x;
GETNAMES=YES; 
RUN;

但导入失败,因为文本文件有丢失数据的周期

这是我在
SAS
log中得到的

NOTE: Invalid data for class_size in line 455 16-17.
 
 455 CHAR  454.34.8.32.17.NA.23.125.12.188 31
     ZONE  3330330303303304403323330332333
     NUMR  454934989329179E1923E125912E188
 sl_no=454 school=34 iq=8 test=32 ses=17 class_size=. meanses=23.125 meaniq=12.188 _ERROR_=1 _N_=454

如何在
SAS

中加载此文本文件您将获得
注意:
,因为
class\u size
字段中有
NA

您假定的是句点(
)实际上是制表符(十六进制代码
09
)。查看要确认的时段下方,
区域
0
NUMR
9
<代码>09是制表符

Proc IMPORT
根据查看文本文件的前几行(默认为20行)来猜测每个字段的数据类型。您的文件只包含20行的数字,因此过程猜测的
class\u size
是数字

有两种做法

  • 什么也不做。阅读日志
    NOTES
    并了解
    NA
    发生的位置。您的数据集中将缺少一个值
  • 或者,
    按原样读取文件,但添加
    gussingrows=MAX语句到您的导入代码
    
    • 混合数据类型列
      class_size
      将被猜测为字符,您可能需要执行另一个步骤将值转换为数字(非数字值转换为缺失值的步骤)
  • 或者,
    编辑文本文件,用句点(
    )替换所有的
    NA
    )。点标记导入过程中缺少的值。导入步骤将不会记录任何不一致的内容
转换字段

PROC IMPORT DATAFILE= '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt'
  DBMS=dlm REPLACE OUT=work.outdata;

  delimiter='09'x;
  GETNAMES=YES; 
  GUESSINGROWS=MAX;
RUN;

data want;
  set outdata (rename=(class_size=class_size_char));
  class_size = input (class_size_char, ?? best12.);
  drop class_size_char;
run;

你是从R创建那个文本文件的吗?该软件包有一个坏习惯,就是将数值的文本值NA放入文本文件中。如果您是创建该文件的人,那么您可以首先检查您使用的系统是否有一种不将NA放入该文件的方法。在带分隔符的文件中,缺少的值通常表示为字段没有任何内容。因此,分隔符彼此紧挨着。对于SAS,可以使用句点表示缺少的值

我不会费心使用PROC IMPORT来读取分隔文件。只需编写一个数据步骤来读取文件。因为看起来您的文件只有六个变量,而且它们都是数字,所以代码很简单

data outdata;
   infile '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
     dsd dlm='09'x firstobs=2 truncover
   ;
   input sl_no school iq test ses class_size meanses meaniq ;
run;
处理输入文件中NA文本的一种方法是用句点替换它们。由于所有字段都是数字字段,因此您可以轻松地执行此操作,因为您不必担心替换恰好在字母N之后有字母A的真实文本。下面是使用
\u infle\u
自动变量的技巧,您可以在读取文件时使用该变量动态进行更改

data outdata;
   infile '/home/u44418748/MSc Biostatistics with SAS/Datasets/school.txt' 
     dsd dlm='09'x firstobs=2 truncover
   ;
   input @;
   _infile_=tranwrd(_infile_,'NA','.');
   input sl_no school iq test ses class_size meanses meaniq ;
run;

看起来您已成功导入该文件。假设数值字段CLASS_SIZE中的NA意味着该类的大小未知,那么将该值设置为missing可能就是您想要的结果。