导入多个txt文件并为每个文件写入相同名称的单个xlsx文件

时间:2019-02-01 17:46:42

标签: r tidyverse writexl

我有一个包括数百个txt文件与每个公司代码/年/月组合为具体的财务数据(即由四位数字的文件前指定的特定公司)的文件夹。我需要一种遍历所有这些文件并为每个文件创建一个xlsx以便审核的方法。

例如,该文件夹包括这样txt文件:

8800-2015-01.txt
8800-2015-02.txt
......and many more like this......

所有文件具有完全相同的列,列名等。我需要读入它们,并为每个文件创建xlsx文件,并将它们保存到同一文件夹中。

在上面的示例中,该文件夹将包含txt和xlsx文件,如下所示:

8800-2015-01.txt
8600-2015-02.txt
8800-2015-01.xlsx
8800-2015-02.xlsx

我可以使用以下代码编写代码以列出特定模式的所有文件:

library(writexl)
setwd(path)

list = list.files(pattern = flob2rx('*8800*.txt*')

然后可以执行以下操作:

txt_files <- lapply(list, function(x) read_delim(x,
                                                 "|",
                                                 escape_double = FALSE,
                                                 trim_ws = TRUE,
                                                 skip = 6))

但是您将如何在每个文件中保持相同的命名约定并将所有xlsx写入同一文件夹呢?


编辑,以显示我做了什么。提供的解决方案为我提供了想法,并最终确定了我使用的方法。我还必须做一些过滤并选择是不是在原始交特定列。

library(writexl)

setwd(path)

file_list = list.files(pattern = glob2rx('*880*.TXT*'))

for (i in file_list){
  write_xlsx(
    filter(
      select(
        read_delim(i,
                   "|",
                   skip = 6,
                   escape_double = FALSE,
                   trim_ws = TRUE),
        "col1","col2",......),
      !is.na(col1) & col2 != 'something'),
    paste0(unlist(strsplit(i,"\\."))[1], ".xlsx"))
}

2 个答案:

答案 0 :(得分:2)

我将假设您的文件中的列由Tab分隔,即R中的'\ t'。

要编写xlsx,您需要install.packages("xlsx")。我对writexl

不熟悉

那么您就可以:

library(xlsx)
setwd(path)
files=dir(pattern="*.txt")
for(i in files){
   write.xlsx(read.csv(i,sep="\t"),paste0(unlist(strsplit(i,"\\."))[1],".xlsx"))
}

答案 1 :(得分:1)

或者,您可以同时执行所有操作。首先创建一个data.frame,其中包含有关文件的所有必要信息:

files_inp <- list.files(pattern ='.txt*')
files_out <- gsub(x = files_inp, pattern = ".txt", replacement = ".xlsx")

df_files <- data.frame(files_inp = files_inp, 
                       files_out = files_out, 
                       stringsAsFactors = FALSE)

现在您知道所有输入名称以及所有输出名称。然后,您可以创建一个函数来读取 txt 并同时保存 xlsx

read_and_save <-function(files_dir){
  file_inp <- files_dir[1]
  file_out <- files_dir[2]

  df <- read.table(file = file_inp, sep = "|")
  write_xlsx(x = df, path = file_out)
}

我正在使用read.table,因为我没有您的数据集。现在,您可以将此功能应用于您拥有的整个文件集:

apply(X = df_files, MARGIN = 1, FUN = read_and_save)