Usando R para listar todos os arquivos com uma extensão especificada


137

Eu sou muito novo no R e estou trabalhando na atualização de um script R para iterar através de uma série de tabelas .dbf criadas usando o ArcGIS e produzir uma série de gráficos.

Eu tenho um diretório, C: \ Scratch, que conterá todos os meus arquivos .dbf. No entanto, quando o ArcGIS cria essas tabelas, ele também inclui um arquivo .dbf.xml. Quero remover esses arquivos .dbf.xml da minha lista de arquivos e, portanto, da iteração. Eu tentei pesquisar e experimentar expressões regulares sem sucesso. Esta é a expressão básica que estou usando (excluindo todas as várias experiências):

files <- list.files(pattern = "dbf")

Alguém pode me dar alguma direção?


1
Se você está tendo dificuldades com regexps, mas conhece o padrão curinga, a função glob2rx()geralmente é útil.
— caracal

Sou eu ou o título é enganoso: deveria ler "apenas com uma extensão específica" (mas também não consigo encontrar uma resposta para excluir determinadas extensões)
— J. Win.

caracal, obrigado pela sugestão. Agora, suponho que eu poderia ter escrito mais sucintamente, estava apenas tentando publicá-lo antes de uma reunião.
— #

chamou minha atenção porque, ao aprender sobre a regexp, fiquei pensando se há uma maneira fácil de excluir. talvez mereça uma pergunta separada.
— J. Win.

Respostas:


198
files <- list.files(pattern = "\\.dbf$")

$no final significa que este é o fim da string. "dbf$"também funcionará, mas adicionar \\.( .é um caractere especial em expressões regulares, portanto você precisa evitá-lo) assegura que você corresponda apenas arquivos com extensão .dbf(caso você tenha, por exemplo, .adbfarquivos).


1
Esse caso é sensível?
— Nsn 20/10/2015

6
@nsn Sim, mas se você quiser o contrário, há ignore.caseargumento da função, então list.files(pattern = "\\.dbf$", ignore.case=TRUE). E veja a página de ajuda dessa função ( ?list.files) para mais detalhes.
— Marek

61

Tente isso, que usa globs em vez de expressões regulares, para selecionar apenas os nomes de arquivos que terminam em .dbf

filenames <- Sys.glob("*.dbf")

12

Pegue o padrão para encontrar "\\.dbf"no final da string usando o $caractere:

list.files(pattern = "\\.dbf$")

1
Se ponto significa ponto da extensão do arquivo, ele não funcionará. Ponto corresponde a um caractere em expressão regular.
— Marek

@Marek também percebeu isso. Minhas reservas de cafeína devem ter caído abaixo de um limite.
— Gavin Simpson

Hmm deveria ter acrescentado que o \` escape the .` agora. Então, alguém se pergunta por que isso foi prejudicado?
— Gavin Simpson

8

Como não sou muito bom em usar expressões regulares sofisticadas, execute essa tarefa da seguinte maneira:

files <- list.files()
dbf.files <- files[-grep(".xml", files, fixed=T)]

Primeira linha apenas lista todos os arquivos do diretório de trabalho. O segundo elimina tudo o que contém ".xml" (grep retorna índices de tais strings no vetor 'files'; o subconjunto com índices negativos remove as entradas correspondentes do vetor). O argumento "corrigido" para a função grep é apenas o meu capricho, pois geralmente quero realizar a correspondência de padrões brutos sem regexprs extravagantes no estilo Perl, o que pode causar surpresa para mim.

Estou ciente de que essa solução simplesmente reflete desvantagens na minha educação, mas para um iniciante, pode ser útil =) pelo menos é fácil.


1
Você deve remover o -sinal antes grep. Eu precisava desse tipo de solução para extrair arquivos específicos de um arquivo zip. Primeiro, obtenha a lista de arquivos em um data.frame e obtenha arquivos específicos e extraia-os mais tarde. lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
— Sezen

5

Fornece a lista de arquivos com o caminho completo:

  Sys.glob(file.path(file_dir, "*.dbf")) ## file_dir = file containing directory

viva o sys.glob!
— shadi 16/03
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.