Como descompactar e ler arquivos de forma recursiva em subfolders

Oi Pessoal,

Boa noite!!

Acho que esta é mais facil para os conhecedores do purrr.

Tenho varios arquivos .gz compactados espalhados em subdiretorios.

Estou tentando uma forma de fazer:

1 de forma recursiva (“varrendo” os subdiretorios)
2. a descompactação (unzip/unz) destes destes arquivos
3. seguido da leitura dos mesmos (.csv) e, finalmente
4. montando o resultados de todos em um único data.frame.

Nota: Por equanto estou com um resultado parcial (em análise) usando o read_dir.

Conseguem me ajudar?

Obrigado,

Fabio

Sem ter uma ideia melhor de como estão esses diretórios, a minha sugestão seria algo do tipo:

library(magrittr)

"~/Downloads/" %>%
  fs::dir_ls(recurse = TRUE, glob = "*.gz") %>%
  purrr::map(~untar(.x, exdir = fs::path_dir(.x))) %>%
  base::names() %>%
  fs::path_ext_remove() %>%
  purrr::map_dfr(readr::read_csv)

Oi Caio,

Obrigado pela resposta.

Estou tendo problemas com a escala, o volume de dados para executar. :sleepy:

São 150MB em arquivos compactados!!

Rodei o código que vc sugeriu e tive que interromper a execução depois de 10h!! rodando sem concluir :crazy_face:

Usando o read_dir, foi bem rapido a descomptacação e leitura recursiva, mas como não consegui fazer o read com separação das colunas pelas vírgulas (sep =",") resultou em uma coluna com todas as informações.

O data.frame é gigante!! :grimacing: com 24M obs of 2 variables

Tentei depois usar o separate através de 29 colunas mas esgotou a memória.

# Descompactando e lendo recursivamente dos subdiretorios
require(textreadr)        
files <- read_dir(path = "D:/Local/stats/Nov-2020/", pattern = ".gz",recursive = TRUE)

# Header do data.frame está na primeira linha do data.frame
colnames <- files %>% 
              select(content) %>%
              slice (1L) %>% 
              str_split_fixed(n=29,pattern = ",")
       
#Tentativa de separar 
temp <- files %>% 
         separate(content,into = colnames,sep = ",")

Erros:
Erro: não é possível alocar vetor de tamanho 0 Kb
Erros durante o embrulho: could not allocate memory (0 Mb) in C function ‘R_AllocStringBuffer’
Error: no more error handlers available (recursive errors?); invoking ‘abort’ restart

Se tiver alguma outra dica.

Obrigado,

Fábio