Импорт нескольких TXT-файлов и запись отдельных XLSX-файлов с одинаковыми именами для каждого - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть папка, содержащая сотни текстовых файлов с конкретными финансовыми данными для каждой комбинации балансовой единицы / года / месяца (для конкретных компаний, которые обозначаются четырехзначным числом в начале файла).Мне нужен способ перебрать все эти файлы и создать xlsx для каждого из них в целях аудита.

Например, папка будет содержать txt-файлы, например:

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

Все файлыстолбцы, имена столбцов и т. д. Мне нужно прочитать их, создать для каждого из них файлы xlsx и сохранить их в той же папке.

В приведенном выше примере эта папка будет содержать тексти 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 голосов
/ 01 февраля 2019

В качестве альтернативы вы можете делать все одновременно.Сначала создайте 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)
0 голосов
/ 01 февраля 2019

Я предполагаю, что у ваших файлов есть столбцы, разделенные табуляцией, то есть '\ t' в R.

Для написания 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"))
}
...