2015-04-17 2 views
-1

У меня есть более 100 файлов txt, которые были результатом SQL scrape на 100 различных схемах и таблицах. Файлы в виде табличных данных, ограниченные трубой. Все имена столбцов в каждом текстовом файле различны.Запись нескольких TXT-файлов в Excel в R

Как только я загрузил файлы в каталог, я создал 3 разных символа для разделения файлов на основе их имени. Например, x.files < - list.files (pattern = "_ X.txt"), поэтому я могу отделить мои «X» файлы от других файлов.

После этого я использовал lapply для перебора этих файлов и «read.csv» их в переменную: x.read < - lapply (x.files, read.csv, sep = "|", header = TRUE).

Теперь мне нужно записать все эти фреймы данных (хранящиеся в списке) обратно в файл XLSX с листом для каждого блока данных. Предпочтение было бы в том, что эти TXT-файлы будут представлять рабочий лист для [i] текстовых файлов в одной книге (файл XLSX).

У меня возникли проблемы с использованием пакетов «xlsx» и «XLConnect». Оба они вызвали нехватку памяти JVM, даже когда я выделяю java.parameters на -Xmx4000m.

Я пробовал использовать «openxlsx», но мне сложно разобраться, как заставить его создать лист, основанный на индексе списка/df. Таким образом, индекс [1] будет «Лист 1» и т. Д. Или также было бы хорошо, если имя листа было именем фактического имени файла (SOME_DATA_STORE_SYS_NAME) минус .TXT в качестве имен файлов (SOME_DATA_STORE_SYS_NAME.X.txt или .P1.txt и т. Д.).

+0

Посмотрите на [ 'xlsx' пакет] (http://cran.r-project.org/web/packages/xlsx/) – Barranka

+0

Я загрузил этот пакет, но я не вижу так или иначе, что он может писать несколько файлов TXT на несколько листов в документе XLSX. – Zach

ответ

2

Это очень простая версия функции вывода 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]) 
} 
+0

Извинения, но я не понимаю, что вы там делаете. Что такое «один»/«два»? У меня есть список dataframes (x.read). Это большой список из 44 элементов размером 221 Мб. – Zach

+0

@Zach - 'eg' - это примерный список, содержащий два кадра данных. Содержимое списка называется (первый объект имеет имя «один», а второй - «два»), но они также могут быть кадры данных в списке, который вы описываете. Если ваш список не имеет названных индексов, вы можете просто использовать значение 'i', чтобы называть ваш листок (например,' sheet <- createSheet (wb, paste («Лист», i)) '). – ElizabethAB

+0

Спасибо @ElizabethAB - Интересно! Я проверю это в понедельник и посмотрю, как он течет. Нужно ли мне явно вызывать каждый фрейм данных списка, как вы указали там? Также, какова цель бит re (1, 100) ...? – Zach

Смежные вопросы