快速解答
使用 RegEdit 更改 Windows 注册表项。在我的系统上,Windows 10,x64,Office 2016,条目
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRow
会变成
0
解释
Proc IMPORT DBMS=EXCEL 推断列 var2 是数字内容,因为它没有扫描足够的 Excel 行来发现有一些非数字内容。因此,当达到非数字内容时,该过程将其替换为缺失值。
你必须这样做
- 强制 IMPORT 扫描足够多的行以查找列中的非数字(如果存在)。
- 导致 IMPORT 将这些列(变量)定义为字符类型
- 在 DATA 步中对导入的数据集进行后处理
扫描更多行 - Excel
没有Proc IMPORT 选项可用于更改扫描的 Excel 行数。
Proc IMPORT DBMS=Excel 在 Windows 中使用 Microsoft 技术来读取 Excel 文件。在 SAS 版本 Windows 注册表来获取参数TypeGuessingRows,即在推断列是字符、数字或日期之前应该扫描多少行。当参数值为0时,在推断之前扫描所有行。
SAS Documentation“SAS/ACCESS® 9.4 Interface to PC Files: Reference, Fourth Edition”章节“Microsoft Excel 工作簿文件”详细介绍了需要根据系统更改的 Windows 注册表项和办公室安装。正如快速中提到的,我的系统有
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRow
8 行的默认值已更改为 0。
奖励:扫描更多行 - 分隔文件
这些将是文本文件,其字段由逗号、制表符或其他字符分隔。
Proc IMPORT DBMS=CSV 可以通过使用 GUESSINGROWS 语句
强制扫描所有行
Proc IMPORT --all my options-- out=import_raw;
GUESSINGROWS=MAX; * statement;
run;
第 2 步 - 后处理
这里是一些示例代码,展示了如何将已知的“棘手”列转换为同名的数字列。 规则是将值<#### 转换为####。
data import;
set import_raw (rename=var2=var2_raw);
if var2_raw =: '<' then
var2 = input(substr(var2_raw,2), best12.);
else
var2 = input(var2_raw,best12.);
drop var2_raw;
run;
您的实际转换规则可能会有所不同——例如,您可能需要添加一个$1 列var2_relation,该列采用值=、< 或>。或者您可以在进行 input() 转换之前压缩该值,删除所有非数字字符。
如果您在编写对所有变量进行相同转换的解决方案时遇到问题,那将是另一个问题。