数据结构:我有一个可以读取为 Excel 或 CSV 文件的数据集。它具有以下变量类型:日期、时间、数字变量,以及错误地将字符附加到数字的数字变量 - 例如 -0.011* 和 0.023954029324)(末尾的括号在单元格中) - 由于写入文件的程序出错。每条记录之间也有空行,删除所有这些是不现实的,因为我有数百个文件要管理。
数据问题:我们已确定某些值在字符之前是正确的(即,只要删除星号,-0.011 就是正确的),而其他值,例如 0.023954029324)则完全不正确,应该省略。请不要评论这个问题,因为它超出了我的控制范围,此时我所能做的就是管理数据,直到错误得到修复并且字符值停止写入文件。
SAS的问题:
1) 如果我将 PROC IMPORT 与 Excel 文件一起使用,SAS 使用前八行(CSV 文件为 20 行)来确定变量是数字还是字符。如果括号的星号没有出现在前 20 行中,则 SAS 表示该变量是数字的,然后会丢失任何后面的带有字符值的单元格。这在星号的情况下是不行的,因为我想保留值的数字部分并在以后的数据步骤中删除星号。使用 PROC IMPORT 导入 Excel 文件不允许使用 GUESSINGROWS 选项(与 CSV 文件一样,请参见下文)。编辑:另外, MIXED=YES 选项不起作用(请参阅下面的评论 - 仍然需要更改 SAS 使用的行数,对我来说,这意味着这个选项......什么?)。
2) 如果我将 PROC IMPORT 与 CSV 文件一起使用,我可以指定 GUESSINGROWS=32767,我会非常兴奋,因为它会确定带有星号的变量是字符并保留星号。但是,非常奇怪的是,它不再将带括号的变量确定为字符(就像导入 Excel 文件时只要括号在前 20 行中那样),而是删除字符并将值四舍五入到最接近的整数(0.1435980234 变为 0,1.82149023843 变为 2,等等)。这太粗略的舍入 - 我需要保留小数位。而且,最重要的是,括号现在不见了,所以我不能丢失适当的单元格。我不知道是否有办法使 SAS 不四舍五入和/或保持括号。大部头书,这是不一致的行为 - 为什么在这种情况下星号而不是括号被认为是一个字符?此外,当我读入带有 PROC IMPORT 的 Excel 文件时(如 (1) 中所述),它可以用括号处理(如果它们出现在前 20 行中) - 另一个不一致之处。
3)如果我使用INFILE,那么 - 我尝试读取的每个变量都会出错 - 这个过程对于数据的变化方式过于敏感和不稳定(我必须为空白编写一个解决方法数据线)。
终极目标(请注意,此代码将在宏中自动运行,如果重要的话):
1)将日期变量读取为日期
2) 将时间变量读取为时间
3) 能够将该变量的任何单元格中存在的带有字符的变量(即使在 20 行之后)识别为字符变量并维护单元格中的值(即不要舍入/删除字符)。这可以通过先验告诉 SAS 让某个变量集成为字符(在我摆脱字符/使单元格丢失后,我会将它们更改为数字),或者通过 SAS 自己识别带有字符的变量。