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

数据结构:我有一个数据集,可以读取为Excel或CSV文件。 它具有以下variablestypes:date,时间,数字variables,以及不正确地将字符附加到数字的数字variables – 例如-0.011 *和0.023954029324)(最后的括号在单元格中) – 由于在写入文件的程序中出错。 每个logging之间也有空行,删除所有这些是不现实的,因为我有数百个文件要pipe理。

数据问题:我们已经确定某些值在字符之前是正确的(即只要星号被删除,-0.011就是正确的),而其他的值(如0.023954029324)却是不正确的,应该丢失。 请不要评论这个问题,因为这是我无法控制的,现在我所能做的只是pipe理数据,直到错误被修复,字符值停止写入文件。

问题与SAS:

1)如果我使用PROC IMPORT和Excel文件,SAS使用前八行(20为CSV文件)来确定variables是数字还是字符。 如果括号的星号在前20行内没有出现,SAS说这个variables是数字的,然后让任何后面的单元格丢失字符值。 这在星号的情况下是不好的,因为我想保留数值的数字部分,并在稍后的数据步骤中删除星号。 使用PROC IMPORT导入Excel文件不允许使用GUESSINGROWS选项(因为它具有CSV文件,请参阅下文)。 编辑:此外,MIXED = YES选项不起作用(见下面的评论 – 仍然需要改变SAS使用的行数,对我来说,这意味着这个选项…什么?)。

2)如果我用一个CSV文件使用PROC IMPORT,我可以指定GUESSINGROWS = 32767,所以我非常兴奋,因为它确定了带星号的variables是字符并保持星号。 然而,它很奇怪不再决定括号为variables的variables(因为只要圆括号在前20行中,导入Excel文件时就会这样做),而是删除了字符,并将值舍入到最接近的整数(0.1435980234变为0,1.82149023843变成2等)。 这是过于粗糙的四舍五入 – 我需要保持小数位。 而且,最重要的是,括号现在已经不存在了,所以我不能让相应的单元格丢失。 我不知道是否有办法让SAS不圆和/或维护括号。 对我来说,这是不一致的行为 – 为什么在这种情况下星号而不是括号被认为是一个字符? 另外,当我读取带有PROC IMPORT的Excel文件(如(1)中所述)时,它可以应付括号(如果它们出现在前20行中) – 另一个不一致。

3)如果我使用INFILE,那么 – 我得到一个错误,每个variables我尝试阅读 – 这个过程是如此敏感和不稳定的数据是如何变化(我必须编码解决空白数据线)。

ULTIMATE GOAL(注意这个代码将在一个macros内自动运行,如果有的话):

1)读取datevariables作为date

2)随时间读取时间variables

3)能够识别variables的任何单元格中的variables(即使在20行之后)作为字符variables并保持单元格中的值(即不轮/删除字符)。 这可以通过先验地告诉SAS让一组variables为字符(在我摆脱字符/使单元丢失后我将它们改为数字),或者通过SAS自己识别variablesw /字符。

  1. SAS实际上默认使用前8行。 这是在registry设置TYPEGUESSROWS定义的, TYPEGUESSROWS通常存储在HKLM \ Software \ Microsoft \ Office \ 14.0 \ Access Connectivity Engine \ Engines \ Excel \ TypeGuessRows \(或者在此处插入您的office-version)。 将该值更改为FFFF(hex)/ 65536(十进制)或其他一些较大的数字,或将其更改为零以search最大行数(超过16000位 – 确切数字很难find)。

  2. 对于CSV文件,您可以编写数据步骤导入来控制每个variables的格式。 最简单的方法是运行PROC IMPORT,然后检查日志; 日志将包含用于在数据步骤中读取文件的完整代码。 然后根据需要修改信息。 你说Infile方法有太多的麻烦,所以也许这对你不起作用,但是通常你可以解决任何不一致的问题 – 如果你的文件不一致,听起来你会做大量的手工工作无论如何。 这使您可以正确读取date/时间variables。

  3. 您也可以使用PROC IMPORT / CSV到日志,将日志写入文件,然后读入THAT并自行生成新的导入代码 – 甚至closures生成的文件的proc内容,进行已知的修改。

不确定你在询问date/时间,因为你在问题的第一部分没有提到问题。

你有一个额外的select是清除字符之前(从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脚本可以很容易地删除这些行为不端的字符。