Excel 导入数字列中包含无效字符的数据
数据结构:我有一个可以读取为Excel或CSV文件的数据集。它有以下变量类型:日期、时间、数字变量,以及错误地将字符附加到数字上的数字变量(例如-0.011*和0.023954029324)(末尾的括号在单元格中),这是由于写入文件的程序中的错误造成的。每个记录之间也有空白行,删除所有这些记录是不现实的,因为我有数百个文件要管理 数据问题:我们已经确定,一些值在字符之前是正确的(即-0.011是正确的,只要删除星号),而其他值,例如0.023954029324)则完全不正确,应该将其丢失。请不要对这个问题发表评论,因为它超出了我的控制范围,此时我所能做的就是管理数据,直到错误被修复,字符值停止写入文件 SAS的问题: 1) 如果对Excel文件使用PROC导入,SAS将使用前八行(CSV文件为20行)来确定变量是数字还是字符。如果括号中的星号没有出现在前20行中,SAS会说变量是数值,然后会使后面的单元格中缺少字符值。对于星号来说,这是不好的,因为我希望保留值的数字部分,并在稍后的数据步骤中删除星号。使用PROC IMPORT导入Excel文件时不允许使用GUESSINGROWS选项(与使用CSV文件时一样,请参见下文)。编辑:此外,MIXED=YES选项不起作用(请参阅下面的注释-仍然需要更改SAS使用的行数,这对我来说意味着此选项起作用…什么?) 2) 如果我对CSV文件使用PROC IMPORT,我可以指定GUESSINGROWS=32767,我会非常兴奋,因为它会确定带星号的变量是字符,并保留星号。然而,很奇怪的是,它不再以括号作为字符来确定变量(就像导入Excel文件时一样,只要括号在前20行中),而是删除字符并将值舍入到最接近的整数(0.1435980234变为0,1.82149023843变为2,等等). 这太粗糙了,我需要保留小数点。最重要的是,括号现在不见了,所以我不能让相应的单元格丢失。我不知道是否有办法使SAS不圆化和/或保留括号。对我来说,这是不一致的行为-为什么在这种情况下星号而不是括号被视为字符?另外,当我读取Excel文件w/PROC IMPORT(如(1)中所述)时,它可以处理w/括号(如果括号出现在前20行中)-另一种不一致Excel 导入数字列中包含无效字符的数据,excel,csv,sas,Excel,Csv,Sas,数据结构:我有一个可以读取为Excel或CSV文件的数据集。它有以下变量类型:日期、时间、数字变量,以及错误地将字符附加到数字上的数字变量(例如-0.011*和0.023954029324)(末尾的括号在单元格中),这是由于写入文件的程序中的错误造成的。每个记录之间也有空白行,删除所有这些记录是不现实的,因为我有数百个文件要管理 数据问题:我们已经确定,一些值在字符之前是正确的(即-0.011是正确的,只要删除星号),而其他值,例如0.023954029324)则完全不正确,应该将其丢失。请不要
3)如果我使用FILILE,那么,我会得到一个错误W/每个变量,我尝试读取-这个过程对于数据的变化是多么敏感和不稳定(并且我必须为空白数据行编码一个工作)。 最终目标(请注意,此代码将在宏中自动运行,如果需要的话):
1) 读取日期变量作为日期 2) 将时间变量读取为时间 3) 能够将变量(即使在20行之后)的任何单元格中包含字符的变量识别为字符变量,并保持单元格中的值(即不舍入/删除字符)。这可以通过事先告诉SAS让某一组变量为字符(在我去掉字符/使单元格丢失后,我会将它们更改为数字),或者通过SAS自己识别带有字符的变量TYPEGUESSROWS
——通常存储在HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TYPEGUESSROWS\中(或在其中插入Office版本)。将该值更改为FFFF(十六进制)/65536(十进制)或其他一些大数字,或更改为零以搜索最大行数(超过16000位-很难找到准确的行数)然后使用proc import在中读取该新文件。我将它分为两个数据步骤,这样您就可以看到它了,但为了便于运行,您可以将它们合并为一个数据步骤—在SAS文档中查找“就地更新文件”。您还可以使用特定于操作系统的工具完成此清理;例如,在Unix上,一个简短的awk脚本可以很容易地删除不正常的字符。此外,如果您在CSV导入方面有问题,我建议您查看日志,查看导入为变量的格式选择了什么;这至少能告诉你哪里出了问题。谢谢你的信息,乔。1) 我
data mydata;
infile myfile /*options*/;
input @@;
length infileline $32767; *or your longest reasonable line;
infileline = compress(_infile_,'.-','kd');
run;
data _null_;
set mydata;
file myfile /*options*/ /*or a new file if you prefer */;
put @1 infileline $32767.; *or your longest reasonable line;
run;