我通常接收来自欧洲和美国的csv
文件。来自欧洲的文件有逗号,来自美国的文件有句点作为小数点。我希望能够将所有这些文件放在一个目录中,并用一个函数加载它们。
最小工作示例:
write.table(data.frame("a" = 1.4, "b" = 2.5), sep = ",",
"periodFile1.csv", dec = ".", row.names = FALSE)
write.table(data.frame("c" = 1.4, "d" = 2.5), sep = ",",
"periodFile2.csv", dec = ".", row.names = FALSE)
我一直在为每种类型的小数点使用单独的程序。
对于作为小数点的周期,我使用以下内容:
periodNames <- list.files(pattern = "*.csv")
lapply(seq_along(periodNames),
function(x) read.csv(periodNames[x], dec = "."))
以下不是我的例行程序的一部分,但对于最低限度的工作示例来说是必要的,否则下一个加载函数将产生错误。
file.remove(c("periodFile1.csv", "periodFile2.csv"))
对于逗号作为小数点,我使用以下内容:
write.table(data.frame("e" = 2.7, "f" = 4.5), sep = ";",
"CommaFile1.csv", dec = ",", row.names = FALSE)
write.table(data.frame("g" = 2.7, "h" = 4.5), sep = ";",
"CommaFile2.csv", dec = ",", row.names = FALSE)
commaNames <- list.files(pattern = "*.csv")
lapply(seq_along(commaNames),
function(x) read.csv(commaNames[x], dec = ",", sep = ";"))
我希望能够将所有文件加载到工作区中,而不考虑小数点的类型。要做到这一点,我希望创建一个加载函数,检查小数点的类型,并使用适当的加载方法。
提前感谢
我建议使用readLines
读取每个文件的几行,并测试内容以确定正确的分隔符。您必须验证此测试是否适用于您的数据,但我会从一些简单的事情开始,比如查看第一行数据中是否有分号:
grepl(';', line)
然后,使用此功能读取文件
read_csv_file <- function(file_path){
second_line <- readLines(file_path, n=2)[2]
if (grepl(';', second_line)){
return(read.csv(file_path, dec=',', sep=';'))
}else return(read.csv(file_path))
}
这样称呼它(我在这里也简化了你的一些代码)
allNames <- list.files(pattern = "*.csv")
lapply(allNames, read_csv_file)
如果;
不是分隔符,则可以使用一列这一事实。
这应该做到:
allNames <- list.files(pattern = "*.csv")
for (i in 1:length(allNames)){
if(dim(read.delim(allNames[i],sep=";"))[2]==1) print(read.csv(allNames[i]))
else print(read.csv2(allNames[i]))
}
当然,您可以将读取的文件加载、组合并保存到任何您想要的位置,而不是打印。