如何检查 CSV 文件是否有逗号或分号作为分隔符?

How to check if CSV file has a comma or a semicolon as separator?

我必须自动读入很多 CSV 文件。有的用逗号作为分隔符,那我用命令read.csv().

有的用分号分隔,那我用read.csv2()

我想写一段代码来识别 CSV 文件是否有逗号或分号作为分隔符(在我阅读之前),这样我就不必每次都更改代码。

我的方法是这样的:

try to read.csv("xyz")
if error 
read.csv2("xyz")

这样的事情可能吗?以前有人这样做过吗? 如何在没有实际看到错误的情况下检查是否存在错误?

假设文件格式之间的唯一区别是分隔符是分号小数点是逗号还是分隔符是逗号小数点是点。

1) fread 在data.table包的注释fread中提到,对于常用的分隔符会自动检测分隔符,然后在使用中读取文件它检测到的分隔符。这还可以处理某些其他格式更改,例如自动检测文件是否具有 header.

2) grepl 看第一行有没有逗号或者分号 然后re-read 文件:

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" 选项