Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 导入数字列中包含无效字符的数据_Excel_Csv_Sas - Fatal编程技术网

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

Excel 导入数字列中包含无效字符的数据,excel,csv,sas,Excel,Csv,Sas,数据结构:我有一个可以读取为Excel或CSV文件的数据集。它有以下变量类型:日期、时间、数字变量,以及错误地将字符附加到数字上的数字变量(例如-0.011*和0.023954029324)(末尾的括号在单元格中),这是由于写入文件的程序中的错误造成的。每个记录之间也有空白行,删除所有这些记录是不现实的,因为我有数百个文件要管理 数据问题:我们已经确定,一些值在字符之前是正确的(即-0.011是正确的,只要删除星号),而其他值,例如0.023954029324)则完全不正确,应该将其丢失。请不要

数据结构:我有一个可以读取为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行中)-另一种不一致

3)如果我使用FILILE,那么,我会得到一个错误W/每个变量,我尝试读取-这个过程对于数据的变化是多么敏感和不稳定(并且我必须为空白数据行编码一个工作)。 最终目标(请注意,此代码将在宏中自动运行,如果需要的话):

1) 读取日期变量作为日期

2) 将时间变量读取为时间

3) 能够将变量(即使在20行之后)的任何单元格中包含字符的变量识别为字符变量,并保持单元格中的值(即不舍入/删除字符)。这可以通过事先告诉SAS让某一组变量为字符(在我去掉字符/使单元格丢失后,我会将它们更改为数字),或者通过SAS自己识别带有字符的变量

  • SAS实际上默认使用前8行。这是在注册表设置中定义的,
    TYPEGUESSROWS
    ——通常存储在HKLM\Software\Microsoft\Office\14.0\Access Connectivity Engine\Engines\Excel\TYPEGUESSROWS\中(或在其中插入Office版本)。将该值更改为FFFF(十六进制)/65536(十进制)或其他一些大数字,或更改为零以搜索最大行数(超过16000位-很难找到准确的行数)

  • 对于CSV文件,可以编写数据步骤导入来控制每个变量的格式。最简单的方法是运行PROC导入,然后检查日志;日志将包含用于在数据步骤中读取文件的完整代码。然后根据需要修改信息。你说你在使用infle方法时遇到了太多的麻烦,所以这可能对你不起作用,但通常你可以解决任何不一致的问题——如果你的文件如此不一致,听起来你无论如何都要做大量的手工工作。这也为您提供了正确读取日期/时间变量的选项

  • 您还可以对日志使用PROC IMPORT/CSV,将日志写到文件中,然后读入并自行生成新的导入代码,甚至可以对生成文件的PROC内容进行修改

  • 不确定你问的日期/时间是什么,因为你在问题的第一部分没有提到它的问题

    另外一个选项是在读取字符之前清除字符(从CSV)。这很简单,如果它真的只是数字和逗号(以及小数和负号):


    然后使用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;