excel 导入数值列中包含无效字符的数据

omqzjyyz  于 2022-12-24  发布在  其他
关注(0)|答案(1)|浏览(285)

数据结构:我有一个数据集,可以作为Excel或CSV文件读取。它有以下变量类型:日期、时间、数值变量以及哪些 * 应该 * 是错误地将字符附加到数字的数值变量-例如-0.011* 和0.023954029324)(结尾的括号在单元格中)-由于写文件的程序中的错误。每个记录之间也有空行,而且删除所有这些是不现实的,因为我有数百个文件要管理。
数据问题:我们已经确定某些值对于字符是正确的(即,只要去掉星号,-0.011是正确的),而其它值,例如0.023954029324),完全不正确,应将其删除。请不要'不要对这个问题发表评论,因为它超出了我的控制范围,此时我所能做的就是管理数据,直到错误得到修复,字符值停止写入文件。
SAS的问题:
1)如果对Excel文件使用PROC IMPORT,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行中)-另一个不一致。
3)如果我使用INFILE,那么-我得到一个错误w/每个变量我试图读入-这个过程是太敏感和不稳定的方式如何变化的数据(我必须编码一个解决办法的空白数据行)。
最终目标(注意,如果有必要,此代码将在宏中自动运行):
1)将日期变量读取为日期
2)将时间变量读取为时间
3)能够识别变量的任何单元格中存在的字符(即使在20行之后)作为字符变量,并在单元格中维护值(即不舍入/删除字符)。这可以通过先验告诉SAS让某个变量集为字符(我会把它们改成数字后,我摆脱字符/使单元格失踪),或由SAS识别变量w/字符本身。

chhqkbe1

chhqkbe11#

  1. SAS实际上默认使用前8行。这在注册表设置TYPEGUESSROWS中定义-通常存储在HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TypeGuessRows\(或在此处插入您的办公室版本)。将该值更改为FFFF(十六进制)/65536(十进制)或其他较大的数字,或零以搜索最大行数(比16000多一位-很难找到确切的数字)。
    1.对于CSV文件,你可以写一个数据步导入来控制每个变量的格式。最简单的方法是运行PROC IMPORT,然后检查你的日志;日志将包含用于在数据步骤中读取文件的完整代码。然后根据需要修改informats。您说您在使用Infile方法时遇到了太多麻烦,因此可能这对您不起作用。但通常情况下,你可以解决任何不一致的问题--如果你的文件是如此不一致,听起来你无论如何都要做大量的手工工作。时间变量也正确。
    1.您还可以使用PROC IMPORT/CSV来导入日志,将日志写入一个文件,然后读取该文件并自己生成新的导入代码--甚至可以从生成的文件中删除proc内容,进行已知的修改。
    不确定您询问的日期/时间是什么,因为您在问题的第一部分没有提到它的问题。
    另外一个选项是在读入之前清除字符(从CSV文件中),如果它真的只是数字和逗号(以及小数和负号),这是非常简单的:
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;

然后使用proc import读取新文件。我将其拆分为两个数据步,以便您可以看到它,但您可以将它们合并为一个以便于运行-在SAS文档中查找“在适当位置更新文件”。您也可以使用操作系统特定的工具完成此清理;例如,在Unix上,一个简短的awk脚本可以很容易地删除行为不端的字符。

相关问题