r-加载包含逗号或句点作为小数点的多个“csv”文件



我通常接收来自欧洲和美国的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]))
    }

当然,您可以将读取的文件加载、组合并保存到任何您想要的位置,而不是打印。

最新更新