我正在编写一些R代码,以将400个Excel文件转换为机器可读的平面文件。接收这些Excel文件时,周转时间很短,并且不可能以机器可读的格式接收初始文件。
我有R代码,它将提取我们需要的行和列中的数据,删除空格并以MR格式很好地呈现。我现在需要解决的问题是,我需要确认400个文件中的每个文件的格式正确,以使该功能正常工作。为此,我只想检查很多简单的事情,例如标题列在每个Excel文件的A9单元格中。
我是R的新手,我真的很努力地编写一个函数,让我可以一次性检查所有400个文件。
我最接近的是这个
template_dir <- "file path of main directory"
files <- list.files(path=template_dir, pattern="*.xlsx", full.names=TRUE, recursive=TRUE)
df.files <- lapply (files, read_excel)
然后生成一个包含400个元素的列表。我可以单独加载这些文件
df.files [1]
但是,如果我尝试使用:
title_loc <- which (df.files [1] == "Title", arr.ind = TRUE)
它不起作用,我只是得到一个空值。我知道“哪个”功能有效,因为当我将单个Excel文件作为df读取到R中(或将文件路径放入)时,“哪个”功能正常工作并返回[1,9]预期的。
这400个文件分布在几个文件夹中(我也无能为力),并且我可以使用list.files获得所有文件的列表。我要做的是执行一系列简单的检查(对“ title”的引用;对“ age”的引用;对“ location”的引用等等),以确认所有400个文件都以相同的方式进行布局。因此,在一个df中列出“ title”的输出将是理想的,因此我可以检查所有400的列是否为“ 1”,所有400的行是否为“ 9”。
我想我想要的是
title_loc <- which (*loop to cycle through every element in df.files* == "Title", arr.ind = TRUE)
但是编写循环的方法使我败下阵来。在列表中获取所有400个Excel文件的文件路径然后循环浏览(而不是使用lapply导入所有数据)会更容易吗?
谢谢
答案 0 :(得分:0)
我不确定机器可读的格式是什么,但是如果您要遍历文件夹中的所有Excel文件并将其全部加载到Excel中,则以下代码示例将为您做到这一点。
# load names of excel files
files = list.files(path = "C:\\your_path_here\\", full.names = TRUE, pattern = ".xlsx")
# create function to read multiple sheets per excel file
read_excel_allsheets <- function(filename, tibble = FALSE) {
sheets <- readxl::excel_sheets(filename)
sapply(sheets, function(f) as.data.frame(readxl::read_excel(filename, sheet = f)),
simplify = FALSE)
}
# execute function for all excel files in "files"
all_data <- lapply(files, read_excel_allsheets)
或
library(XLConnect)
testDir <- "C:\\your_path_here\\"
re_file <- ".+\\.xls.?"
testFiles <- list.files(testDir, re_file, full.names = TRUE)
# This function rbinds in a single dataframe
# the content of multiple sheets in the same workbook
# (assuming that all the sheets have the same column types)
rbindAllSheets <- function(file) {
wb <- loadWorkbook(file)
sheets <- getSheets(wb)
do.call(rbind,
lapply(sheets, function(sheet) {
readWorksheet(wb, sheet)
})
)
}
# Getting a single dataframe for all the Excel files
result <- do.call(rbind, lapply(testFiles, rbindAllSheets))