我通常会收到来自欧洲和美国的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 = ";"))
无论小数点的类型如何,我都希望能够将所有文件加载到工作区中。为此,我希望创建一个加载函数来检查小数位的类型并使用适当的加载方法。
非常感谢提前
答案 0 :(得分:2)
我建议使用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)
答案 1 :(得分:1)
如果;
不是分隔符,则可以使用一列的事实。
这应该这样做:
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]))
}
当然,您可以在任何地方加载,组合和保存读取的文件,而不是打印。