我必须自动读取大量 CSV 文件。有些有逗号作为分隔符,然后我使用 command read.csv()
。
有些有分号作为分隔符,然后我使用read.csv2()
.
我想编写一段代码来识别 CSV 文件是否有逗号或分号作为分隔符(在我阅读之前),这样我就不必每次都更改代码。
我的方法是这样的:
try to read.csv("xyz")
if error
read.csv2("xyz")
这样的事情可能吗?以前有人这样做过吗?如何在没有实际看到的情况下检查是否有错误?
这里有几种方法,假设文件格式之间的唯一区别是分隔符是分号,小数点是逗号,还是分隔符是逗号,小数点是点。
1) fread 如data.table包中的注释所述fread
,将自动检测常用分隔符的分隔符,然后使用它检测到的分隔符读取文件。这也可以处理某些其他格式的更改,例如自动检测文件是否有标题。
2) grepl 查看第一行是否有逗号或分号,然后重新读取文件:
L <- readLines("myfile", n = 1)
if (grepl(";", L)) read.csv2("myfile") else read.csv("myfile")
3) count.fields 我们可以假设分号,然后计算第一行中的字段。如果有一个字段,则以逗号分隔,如果没有,则以分号分隔。
L <- readLines("myfile", n = 1)
numfields <- count.fields(textConnection(L), sep = ";")
if (numfields == 1) read.csv("myfile") else read.csv2("myfile")
更新 添加 (3) 并对所有三个进行了改进。
一个警告。read.csv2() 旨在处理逗号作为小数点和分号作为分隔符(默认值)。如果您的 csv 文件有分号作为分隔符和点作为小数点,您可能会因为 dec = "," 设置而遇到问题。如果是这种情况,并且您确实将分隔符作为文件之间的唯一区别,最好直接使用 read.table() 更改“sep”选项