使用proc import sas指定格式

时间:2018-06-12 07:48:58

标签: import sas format dataset proc

我正在尝试将.txt文件中的一些数据导入WPS(使用SAS语言)。 Everythings工作得很好,直到我意识到对于一个列/变量,我的一些观察被切断了。例如,在列/变量Type中,我在原始文件中的第一个观察结果是:

RAN
FG
MAJOFG
ARBA
ARBV

但在我的sas数据集中,这是我得到的数据:

RAN
FG
MAJ
ARB
ARB

所以我想在导入过程中使用格式来使sas总是花8美元。格式。它可以与proc导入一起使用吗? 这是我的代码:

proc import out = sasuser.frais
  datafile="~/NAS/M/XXX.txt"
  dbms=dlm replace;
  delimiter=";";
  getnames=yes;
  datarow=2;
run;

我也尝试使用数据infile但是由于某种原因它会移动我的数据行(第二行的开头在第一行的末尾开始,可能是因为大多数时候我的最后4列/变量是空的)。我有20多个变量,其中大部分是由sas正确导入的(就我的意思而言),所以如果我能避免为每个变量命名一个格式,那就太棒了!

3 个答案:

答案 0 :(得分:1)

尝试使用GUESSINGROWS声明:

Proc IMPORT … ;
  …
  GUESSINGROWS = 100;
run;

使用带有DATA语句的INPUT步骤且某些行不完整时,INFILE语句应指定MISSOVER选项。这将帮助您创建一个数据集,其中每行对应于数据文件的每一行。

  INFILE … FIRSTOBS=2 DLM=';' DSD MISSOVER;
  length v1-v20 $30;
  INPUT v1-v20;

在数据步骤隐式循环步骤期间,数据行末尾没有相应输入值的任何变量都将被设置为缺失,输入语句将不会尝试在下一行中查找更多值。

答案 1 :(得分:0)

您可以通过调整guessingrows参数而不是指定信息来获得可接受的结果,例如:

data _null_;
  file "%sysfunc(pathname(work))\test.txt";
  infile cards;
  input;
  put _infile_;
  cards;
RAN
FG
MAJOFG
ARBA
ARBV
;
run;

proc import out = example
  datafile="%sysfunc(pathname(work))\test.txt"
  dbms=dlm replace;
  delimiter=";";
  getnames=yes;
  datarow=2;
  guessingrows=3;
run;

如果将此值从3更改为2,则proc import仅在猜测变量RAN的适当长度时查看前2个数据行,并且对后续行具有更长的值进行截断。

答案 2 :(得分:0)

我的问题是我计划将此输入代码用于多个文件,并且类型的观察顺序是随机的。因此,对于10行或100行,观察的长度为3,然后观察到6,这是完全可能的。但即使我不知道顺序,我也知道可能的差值(最大长度为6) 。所以猜测在我的情况下是行不通的。但我找到了一种方法来纠正我的代码与John Doe提供的链接(https://communities.sas.com/t5/Base-SAS-Programming/Text-File-Import-force-the-correct-Informat-and-format/td-p/281701) 我获取了proc导入生成的数据,并将其修改为需要更改的一个变量。谢谢大家!