我有很多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")
。我有一个类似的文件,它通过更改区域设置来工作。如果不起作用,您可以尝试更改为其他区域设置。