跳转至

%ReadAllRTF

ReadAllRTF

读取指定文件夹中的所有 RTF 文件,将所有 RTF 文件转为 SAS 数据集。

Compatibility : RTF 1.6 specification

依赖

Transcode -> Cell_Transcode -> ReadRTF -> ReadAllRTF

语法

必选参数

可选参数

参数说明

DIR

Syntax : path | fileref

指定 RTF 文件所在目录路径或引用。指定的目录路径必须是一个合法的 Windows 路径。

[!IMPORTANT]

  • 当指定的物理路径太长时,应当使用 filename 语句建立目录引用,然后传入目录引用,否则会导致 SAS 无法正确读取。

Example :

DIR = "D:\~\01 table"
filename ref "D:\~\01 table";
DIR = ref;

OUTLIB

Syntax : libname

指定输出数据集存放的逻辑库,该逻辑库必须事先定义,且逻辑库对应的物理路径必须存在

Default : WORK


VD

Syntax : drive

指定临时创建的虚拟磁盘的盘符,该盘符必须是字母 A ~ Z 中未被操作系统使用的一个字符。

Default : #AUTO

默认情况下,宏程序将自动选择一个未被操作系统使用的字母作为虚拟磁盘的盘符。


COMPRESS

COMPRESS


DEL_RTF_CTRL

DEL_RTF_CTRL


程序执行流程

  1. 使用 DOS 命令获取指定文件夹中的所有 RTF 文件,将 RTF 文件列表存储在 _tmp_rtf_list.txt 中;
  2. 读取 _tmp_rtf_list.txt 文件,获取 RTF 文件名称,构建并执行 filename 语句;
  3. 调用宏 %ReadRTF(),将 RTF 文件转换为 SAS 数据集
  4. 删除临时数据集
  5. 删除 _tmp_rtf_list.txt

细节

1. 如何获取文件夹中所有 RTF 文件

使用全局语句 X ... 调用 Windows 下的 DOS 命令,使用 DIR 命令获取文件夹中后缀为 .rtf 的文件列表,并存储在文件夹中的 _tmp_rtf_list.txt 中。

在 CMD 中,该命令如下所示:

dir "~\*.rtf" /b/on > "~\_tmp_rtf_list.txt" & exit

注意,不要忘记使用 exit 退出终端窗口;

在 SAS 中,上述命令改写为:

X "dir ""~\*.rtf"" /b/on > ""~\_tmp_rtf_list.txt"" & exit"

~ 替换为宏变量 &dir,即可。

⚠ 在 Unicode 环境下,SAS 对于含中文字符的超长路径(超过 262 字符)支持不够友好,为了防止部分 RTF 文件因路径过长导致无法读取,可以使用命令 subst 临时建立虚拟磁盘映射,从而缩短文件路径,以便 SAS 能够正确读取 RTF 文件。

因此,在 SAS 中,上述命令进一步改写为:

X "subst &vd: ""&dir"" & dir ""&vd:\*.rtf"" /b/on > ""&vd:\_tmp_rtf_list.txt"" & exit";

所有 RTF 文件读取完成后,记得删除虚拟磁盘映射:

X " del ""&vd:\_tmp_rtf_list.txt"" & subst &vd: /D & exit";

2. 如何识别符合命名要求的 RTF 文件

通常情况下,输出的 RTF 文件名都含有一个序号,例如:表7.1.1 受试者分布 筛选人群.rtf 中的 7.1.1,此外前缀 也是固定的字符,通过这一规律,可以识别那些通过 SAS 输出的 RTF 文件。因此,可以构建以下正则表达式识别可以处理的 RTF 文件:

/^((?:列)?表|清单)\s*(\d+(?:\.\d+)*)\.?\s*(.*)\.rtf\s*$/o

该正则表达式包含 3 个 buffer,各自含义如下:

  • buffer1 : 文件名类型,如:列表、表、清单
  • buffer2 : 文件名序号,如:7.1.1
  • buffer3 : 文件名主体,如:受试者分布 筛选人群

若 RTF 文件名匹配上述正则表达式,则在临时数据集 _tmp_rtf_list 中,变量 rtf_valid_flag 将被标记为 Y

3. 如何读取符合命名要求的 RTF 文件并转换为 SAS 数据集

#2 的临时数据集 _tmp_rtf_list 中,筛选变量 rtf_valid_flag 的值为 Y 的观测,然后通过使用 call execute 调用宏 %ReadRTF(),具体如下:

call execute('%nrstr(%ReadRTF(file = ' || fileref || ', outdata = ' || outdata_name || '(label = "' || ref_label || '"), compress = yes' || '));');

注意:需要给输出数据集添加标签,因此参数 outdata 需要添加数据集选项 label = "xxx"

3. 如何给输出的 SAS 数据集自动命名和添加标签

根据 #2 获取的 buffer,自动为输出的数据集附加属性。 buffer1 和 buffer2 将作为输出数据集的名称,具体操作如下:

  • 若 buffer1 = "表",则数据集名称以 ‘T’ 开头
  • 若 buffer1 = "列表" or "清单",则数据集名称以 ‘L’ 开头
  • 将 buffer2 中的句点(.)替换为下划线(_),以符合 SAS 名称规范

连接上述处理后的字符串,即为输出数据集的名称,例如:T_7_1_1

buffer3 的内容将作为输出数据集的标签。

示例程序

%ReadAllRTF(dir = "D:\~\TFL\table");

libname qc "D:\qc";
%ReadAllRTF(dir = "D:\~\TFL\table", outlib = qc);

%ReadAllRTF(dir = "D:\~\TFL\table", outlib = qc, vd = X);

%ReadAllRTF(dir = "D:\~\TFL\table", outlib = qc, vd = X, compress = yes);

%ReadAllRTF(dir = "D:\~\TFL\table", outlib = qc, vd = X, compress = yes, del_rtf_ctrl = yes);

%ReadAllRTF(dir = %str(D:\~\TFL\table), outlib = qc, vd = X, compress = yes, del_rtf_ctrl = yes);

filename dirref "D:\~\TFL\table";
%ReadAllRTF(dir = dirref, outlib = qc, vd = X, compress = yes, del_rtf_ctrl = yes);