R-从PurpleAir传感器读取csv文件,并跳过某些行末尾包含非标准字符的错误位置



我有很多PurpleAir传感器,它们每天将一个.csv文件保存到SD卡中,并将日期用作文件名。我正在尝试从这些日常.csv文件中提取并组合数据。

由于某种原因,某些行的最后一个单元格中的数据后面跟着3个非标准字符,并以这种方式显示在.csv文件中:0.46字符的屏幕截图,因为它们没有显示为文本

read.csv("filepath"(-正确读取标题行和所有行,直到这些非标准字符第一次出现,然后不加载其余数据。如果错误在前几行,函数会给出以下错误:

Warning message:
In read.table(file = file, header = header, sep = sep, quote = quote,  :
incomplete final line found by readTableHeader on '20200825.csv'

手动打开文件并删除这些额外的字符可以让R正确地向下读取到这些字符出现的下一行(这些字符出现在看似随机的行中,但总是出现在最后一个单元格的行末(。

我不需要最后一列的数据,所以有没有办法告诉函数忽略最后一列,只读取第一列?

我已经尝试了来自多个线程的许多建议,但到目前为止还不能解决这个问题。手动打开文件并删除字符不是一个选项,因为我有很多文件。

(值得注意的是,尝试用readLines以文本形式读入并修复字符只会导致函数在遇到与read.csv相同的字符时结束(

非常感谢您的支持!

我也遇到过这个问题。以下一行R代码处理非标准字符,如果需要,还会在最后一行的末尾添加一个换行符(这也是我的一些PurpleAir数据所需要的(,并将其写入一个新文件,R可以毫无问题地读取该文件:

system(paste0("cat '", fname, "' | tr -d '32' | sed '$a\' > '", new_fname, "'"))

其中fname是"path-to-file/filename.csv"并且new_fname"path-to-newfile/newfilename.csv"

参考文献:

  • 在R中运行sed:取随机值并放入system((命令
  • https://www.unix.com/shell-programming-and-scripting/108908-removing-z-character-file.html
  • https://unix.stackexchange.com/questions/31947/how-to-add-a-newline-to-the-end-of-a-file

然而,这不是一个优雅的解决方案。如果有人有一个更好的,不需要写新文件(或者重写旧文件——我绝对不想这么做(,我很感兴趣!谢谢你的建议。

在读取csv文件之前,请尝试此命令Sys.setlocale("LC_ALL", "C")。我有一个类似的文件,它通过更改区域设置来工作。如果不起作用,您可以尝试更改为其他区域设置。

最新更新