【问题标题】:Importing txt file in SAS在 SAS 中导入 txt 文件
【发布时间】:2021-02-26 16:13:32
【问题描述】:

我尝试使用以下代码在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日志中得到的

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_SIZE 中的 NA 意味着该类的大小未知,那么将值设置为缺失可能就是您想要发生的事情。

标签: import sas txt


【解决方案1】:

由于class_size 字段中的NA 值,您将获得NOTE:

你认为句号(.)实际上是制表符(十六进制代码09)。在句号下查看以确认,ZONE0NUMR 909 是制表符。

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

有几个行动方案。

  • 什么都不做。阅读您的日志NOTES 并了解NA 出现的位置,您的数据集中将缺少值。
  • 或者,
    按原样读取文件,但在导入代码中添加 GUESSINGROWS=MAX; 语句
    • 混合数据类型class_size 将被猜测为字符,您可能需要执行另一个步骤将值转换为数字(非数字值转换为缺失值)

  • 编辑文本文件,用句点 (.) 替换所有 NA。点表示 IMPORT 期间的缺失值。 IMPORT 步骤不会与 LOG 相关。

转换字段

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;

【讨论】:

    【解决方案2】:

    您是否从 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 的真实文本。这是使用 _INFILE_ 自动变量的技巧,您可以用于在读取文件时即时进行更改。

    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;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-08
      • 1970-01-01
      • 1970-01-01
      • 2015-05-04
      • 1970-01-01
      • 2016-11-24
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多