SAS:将变量转换为文本文件导入的时间序列 - 长度大于32.767

时间:2016-10-12 11:17:14

标签: sas

我从供应商处获取包含特定日历的所有假期的日历文件。

该文件包含由管道(|)分隔的7列。但是,包含实际假日的第7列是以分号(;)。

分隔的字符串格式

我的问题是第7列的长度大于32.767 - 那么我到目前为止使用一些数组和转置技巧所做的解决方案已不再适用了。

基本上文本文件如下:

INTERNAL_NAME|ERROR_CODE|NUMBER_OF_FIELDS|CALENDAR_CODE|CALENDAR_TYPE|CALENDAR_NAME|DATES

US|0|4|US|Country|United States|;2;15728;1;5;19440101;5;19440102;5;19440103;5;19440108;5;19440109......etc.

然而,第7列以漂亮的格式提供,以便给出数组/矩阵的大小,并在字符串的开头给出分隔符。

* 1st charachter = delimiter - > ;

*矩阵中的维数 - > 2

*矩阵中的行数 - > 15.728

*列数 - > 1

*数据元素+数据 - > 5 =日期和数据= 01JAN1944等。

我想要的结果是一个看起来像

的数据集
INTERNAL_NAME DATES
US      01JAN1944
US      02JAN1944
US      03JAN1944
US      08JAN1944

等。直到15.728观察到......

1 个答案:

答案 0 :(得分:0)

你可以很容易地做到这一点。

手动解决方案,即假设字段与您说的一样,是使用辅助分隔符(;),然后您可以自己解析该初始字符串,因为它已知是短。然后迭代该字符串的输入,使用@来保持该行。

data want;
infile datalines4 dlm=';' truncover;
length initial_string $500;
input initial_String $ @;
input dim row col @;
do _n_ = 1 by 1 until (missing(holiday_date));
  input col_type holiday_Date @;
  if not missing(holiday_date) then output;
end;
datalines4;
US|0|4|US|Country|United States|;2;15728;1;5;19440101;5;19440102;5;19440103;5;19440108;5;19440109
;;;;
run;

如果您想使用告诉您分隔符/等的信息。为了驱动readin,你可以这样做,但它需要两次传递数据文件(除非它有一组有限的可能性,你可以使用if / else分支与那些有限的输入语句集)。一遍将只读取该部分,然后调用宏以在单独的数据步骤中读取其余部分。但是,如果这始终是文件的格式,并且您并不真正关心这些字段 - 您只需要与它们一起工作 - 上面可能更好,因为它更快,更简单。