在 R 中将多个 TXT 文件写入 Excel
Write multiple TXT files to Excel in R
我有超过 100 个 txt 文件,这些文件是 SQL 在 100 个不同的模式和表中抓取的输出。文件作为表格数据,管道分隔。
每个文本文件中的所有列名都不同。
将文件加载到目录后,我创建了 3 个不同的符号来根据文件名分隔文件。例如,x.files <- list.files(pattern="_X.txt") 这样我就可以将 "X" 文件与其他文件分开。
之后我使用 lapply 遍历这些文件并将它们 "read.csv" 放入变量中: x.read <- lapply(x.files, read.csv, sep = "|", header = TRUE).
我现在需要做的是将所有这些数据帧(存储在列表中)写回 XLSX 文件,每个数据帧都有一个 sheet。首选是这些 TXT 文件将代表单个工作簿(XLSX 文件)中 [i] 个文本文件的作品sheet。
我在使用 'xlsx' 和 'XLConnect' 软件包时遇到了一些问题。它们都导致 JVM 运行 内存不足,即使我将 java.parameters 分配给 -Xmx4000m.
我试过使用 'openxlsx',但我很难弄清楚如何让它根据 list/df 的索引创建 sheet。因此,索引 [1] 将是 "Sheet 1" 等等。或者,如果 sheet 名称是实际文件名的名称 (SOME_DATA_STORE_SYS_NAME) 减去 .TXT,因为文件名是(SOME_DATA_STORE_SYS_NAME.X.txt 或 .P1.txt, 等等).
这是我经常使用的 Excel 写出函数的一个非常简单的版本。请注意,您的列表名称必须是唯一的,否则这将覆盖工作表。如果您的数据框非常大,这可能不是一个可行的解决方案。
解决方案 1 使用 xlsx
程序包在您的计算机内存中构建一个 Excel 工作簿,然后同时写入所有工作表。
require(xlsx)
eg <- list("one" = data.frame(one = rep(1, 100)),
"two" = data.frame(two = rep(2, 200)))
wb <- createWorkbook()
for (i in seq_along(eg)) {
sheet <- createSheet(wb, names(eg)[i])
addDataFrame(eg[i], sheet)
}
saveWorkbook(wb, "eg.xlsx")
解决方案 2 使用 XLConnect
包并将数据帧一次写入一个 Excel 工作表(对计算机内存的要求较低)。
require(XLConnect)
eg <- list("one" = data.frame(one = rep(1, 100)),
"two" = data.frame(two = rep(2, 200)))
for (i in seq_along(eg)) {
writeWorksheetToFile(file = "eg.xlsx", data = eg[i], sheet = names(eg)[i])
}
我有超过 100 个 txt 文件,这些文件是 SQL 在 100 个不同的模式和表中抓取的输出。文件作为表格数据,管道分隔。 每个文本文件中的所有列名都不同。
将文件加载到目录后,我创建了 3 个不同的符号来根据文件名分隔文件。例如,x.files <- list.files(pattern="_X.txt") 这样我就可以将 "X" 文件与其他文件分开。
之后我使用 lapply 遍历这些文件并将它们 "read.csv" 放入变量中: x.read <- lapply(x.files, read.csv, sep = "|", header = TRUE).
我现在需要做的是将所有这些数据帧(存储在列表中)写回 XLSX 文件,每个数据帧都有一个 sheet。首选是这些 TXT 文件将代表单个工作簿(XLSX 文件)中 [i] 个文本文件的作品sheet。
我在使用 'xlsx' 和 'XLConnect' 软件包时遇到了一些问题。它们都导致 JVM 运行 内存不足,即使我将 java.parameters 分配给 -Xmx4000m.
我试过使用 'openxlsx',但我很难弄清楚如何让它根据 list/df 的索引创建 sheet。因此,索引 [1] 将是 "Sheet 1" 等等。或者,如果 sheet 名称是实际文件名的名称 (SOME_DATA_STORE_SYS_NAME) 减去 .TXT,因为文件名是(SOME_DATA_STORE_SYS_NAME.X.txt 或 .P1.txt, 等等).
这是我经常使用的 Excel 写出函数的一个非常简单的版本。请注意,您的列表名称必须是唯一的,否则这将覆盖工作表。如果您的数据框非常大,这可能不是一个可行的解决方案。
解决方案 1 使用 xlsx
程序包在您的计算机内存中构建一个 Excel 工作簿,然后同时写入所有工作表。
require(xlsx)
eg <- list("one" = data.frame(one = rep(1, 100)),
"two" = data.frame(two = rep(2, 200)))
wb <- createWorkbook()
for (i in seq_along(eg)) {
sheet <- createSheet(wb, names(eg)[i])
addDataFrame(eg[i], sheet)
}
saveWorkbook(wb, "eg.xlsx")
解决方案 2 使用 XLConnect
包并将数据帧一次写入一个 Excel 工作表(对计算机内存的要求较低)。
require(XLConnect)
eg <- list("one" = data.frame(one = rep(1, 100)),
"two" = data.frame(two = rep(2, 200)))
for (i in seq_along(eg)) {
writeWorksheetToFile(file = "eg.xlsx", data = eg[i], sheet = names(eg)[i])
}