Разархивирование файлов с помощью цикла через фрейм данных, определяющий путь к файлу

#r #dataframe #loops #unzip

#r #фрейм данных #циклы #разархивируйте

Вопрос:

У меня есть фрейм данных, который содержит все пути к файлам моего каталога и подкаталога. Мой первый набор данных содержит входной «путь»:

  Input: 
 dataANew JerseyConstruction2020.10.27Results.zip
 dataANew JerseyMaterials2020.10.27Results.zip
 dataAPennsylvaniaConstruction2020.10.27Results.zip
 dataAPennsylvaniaElectrician2020.10.27Results.zip
  

Мой второй набор данных содержит «выходной» путь:

  Output:
 dataANew JerseyConstruction2020.10.27
 dataANew JerseyMaterials2020.10.27
 dataAPennsylvaniaConstruction2020.10.27
 dataAPennsylvaniaElectrician2020.10.27
  

Как вы можете видеть, я хочу, чтобы файлы были разархивированы в ту же папку. В настоящее время я использую цикл for без особого успеха. Это неверно для цикла?

  for(i in length(input)){
   for(f in length(output)){
      path <- input[i]
      out <- output[f]
      unzip(path, out) 
  }}
  

Ответ №1:

создайте список, содержащий все файлы, которые вы хотите разархивировать. затем вы можете просто использовать lapply для разархивирования всего списка

   lapply(filelist, unzip) #or sapply for data frames
  

если у вас много файлов (и ssd), вы можете использовать pbapply библиотеку для встроенной панели прогресса (и многоядерной обработки, если хотите) — без ssd многоядерная обработка кажется медленнее, чем обычная lapply — я предполагаю, что это из-за скорости чтения-записи обычных жестких дисков

 pblapply(filelist, unzip)
  

для меня это выглядит так:

 file_vec<-as.vector(filelist[1:5]) # my original filelist
file_vec # is a vector
sapply(file_vec, unzip)

     2020-08-01T000000_AIU-1936.ghg                 2020-08-01T003000_AIU-1936.ghg                 2020-08-01T010000_AIU-1936.ghg                
[1,] "./2020-08-01T000000_AIU-1936.data"            "./2020-08-01T003000_AIU-1936.data"            "./2020-08-01T010000_AIU-1936.data"           
[2,] "./2020-08-01T000000_AIU-1936.metadata"        "./2020-08-01T003000_AIU-1936.metadata"        "./2020-08-01T010000_AIU-1936.metadata"       
[3,] "./2020-08-01T000000_AIU-1936-biomet.data"     "./2020-08-01T003000_AIU-1936-biomet.data"     "./2020-08-01T010000_AIU-1936-biomet.data"    
[4,] "./2020-08-01T000000_AIU-1936-biomet.metadata" "./2020-08-01T003000_AIU-1936-biomet.metadata" "./2020-08-01T010000_AIU-1936-biomet.metadata"
     2020-08-01T013000_AIU-1936.ghg                 2020-08-01T020000_AIU-1936.ghg                
[1,] "./2020-08-01T013000_AIU-1936.data"            "./2020-08-01T020000_AIU-1936.data"           
[2,] "./2020-08-01T013000_AIU-1936.metadata"        "./2020-08-01T020000_AIU-1936.metadata"       
[3,] "./2020-08-01T013000_AIU-1936-biomet.data"     "./2020-08-01T020000_AIU-1936-biomet.data"    
[4,] "./2020-08-01T013000_AIU-1936-biomet.metadata" "./2020-08-01T020000_AIU-1936-biomet.metadata"
  

я пробовал это и с zip, и это работает — я просто в основном использую данные licor, отсюда и .ghg. я работаю с Windows, рабочий каталог устанавливается туда, где находятся данные. у меня мало опыта работы с linux / macOS, но он должен работать одинаково

Комментарии:

1. Когда я использую оператор lapply, я получаю следующую ошибку: В FUN(X[[i]], …): ошибка 1 при извлечении из zip-файла

2. как выглядит ваше имя файла? я имею в виду, у вас есть полный путь или только относительные имена путей?

3. «\\data\A\New Jersey\Construction\2020.10.27\Results.zip »

4. Возможно, есть проблема со списком путей к файлам? Возможно ли это сделать, используя вектор в фрейме данных?

5. для меня это так, я добавлю это в свой ответ