【发布时间】:2020-12-21 09:47:01
【问题描述】:
如何根据列名而不是文件名导入 csv 文件?假设我的工作目录中有 2 个不同的 csv 文件。其中一个文件名为“interesting.csv”,列名如下:“interesting1”“interesting2”“interesting3”。
我正在寻找可以扫描此文件夹、此工作目录并按列名检查文件的内容,以便我可以使用 read_csv2 读取文件“interesting.csv”。我想知道它是如何完成的,因为有时文件名会改变。假设“interesting.csv”变为“interesting_cool.csv”,但列名不会改变。在这种情况下 read_csv2("interesting.csv") 将不起作用,因为不会有这样的文件。
是否有一个函数可以“扫描”文件夹中所有文件的标题并将其与我提供给 Rscript 的名称进行比较?
类似这样的:read_csv2(find_file_with_headers("interesting1", "interesting2", "interesting3"))
很抱歉,如果这是重复的,我找不到我需要的东西。
问候。
更新 Ronan 的方法:
file_list1 <- list.files(getwd(), full.names = TRUE, pattern = "\\.csv$")
file_list2 <- list.files(getwd(), full.names = TRUE, pattern = "\\.CSV$")
(file_list <- c(file_list1, file_list2)); rm(file_list1, file_list2)
col_names = c("interesting1" "interesting2" "interesting3")
file_index <- which(sapply(file_list, function(x)
all(col_names %in% names(read.csv2(x, nrows = 0)))))[1]
return(read.csv2(file_list[file_index]))
如果我像这样拆分它,file_index 工作正常,而“file_index”将导致一个 NA。如果标题适合,这不应该发生,对吧?因此 return 也不起作用并给出错误:文件中的错误(文件,“rt”):无效的“描述”参数
【问题讨论】:
-
我看到的唯一方法是读取所有 csv 文件的第一行获取它们的标题,然后如果标题匹配某些标准,则导入文件。不过,您可能需要重新考虑此策略。保持表的文件名固定更容易处理。一个中庸之道可能是通过前缀增加文件名,例如,interesting_6.csv、nteresting_7.csv 并导入最新的。
-
您能帮我打印一下
head(file_list)中的内容吗? -
[1] "C:/Users/Dutschke/file1.csv" "C:/Users/Dutschke//file2.csv" [3] "C:/Users/Dutschke/file3.csv " "C:/Users/Dutschke/file4.csv" [5] "C:/Users/Dutschke/file5.CSV" 并且其中一个文件具有列 "interesting1" "interesting2" "interesting3"
-
file_index应该有一个包含col_names中所有列的文件号。所以我认为没有一个文件包含所有列,这就是它返回NA的原因。确保列名中没有错字、前导/滞后空格。他们需要完全匹配。names(read.csv2(file_list[1], nrow = 0))返回什么? -
是的,结果是一样的,但是如果你的文件很大,
read_csv2会更慢,因为read_csv2正在读取文件的所有行,而read.csv2只读取 1(标题)行.
标签: r