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?

chawkins
fonte
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).

Marek
fonte
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")
G. Grothendieck
fonte
12

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

list.files(pattern = "\\.dbf$")
Gavin Simpson
fonte
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.

donshikin
fonte
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
Surya
fonte
viva o sys.glob!
shadi 16/03