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.