使用R列出具有指定扩展名的所有文件


137

我是R的新手,正在更新R脚本以遍历使用ArcGIS创建的一系列.dbf表并生成一系列图形。

我有一个目录C:\ Scratch,它将包含我的所有.dbf文件。但是,当ArcGIS创建这些表时,它还包含一个.dbf.xml文件。我想从文件列表中删除这些.dbf.xml文件,从而从迭代中删除。我尝试搜索并尝试使用正则表达式无济于事。这是我正在使用的基本表达式(不包括所有各种实验):

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

谁能给我一些指导?


1
如果您正在使用正则表达式,但又知道通配符模式,则函数glob2rx()通常会很有帮助。
caracal

是我还是标题误导了:应该读“仅具有特定扩展名”(但我也找不到排除某些扩展名的答案)
J. Win。

卡拉卡尔,谢谢你的建议。jonw,我想我可以更简洁地表达一下,我只是想在会议之前发布它。
chawkins'2

它引起了我的注意,因为当我了解正则表达式时,我一直在想是否有一种简单的方法可以排除。也许值得一个单独的问题。
J. Win。

Answers:


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

$在末尾意味着这是字符串的结尾。"dbf$"也可以使用,但是添加\\..在正则表达式中是特殊字符,因此您需要对其进行转义)确保您仅匹配带有扩展名的文件.dbf(以防您拥有例如.adbf文件)。


1
那是区分大小写的吗?
nsn

6
@nsn是的,但是如果需要ignore.case,则函数的参数为​​so list.files(pattern = "\\.dbf$", ignore.case=TRUE)。并在该功能的帮助页面(?list.files)上查看更多详细信息。
Marek

61

尝试使用glob而不是正则表达式的方法,这样它只会选择以结尾的文件名 .dbf

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

12

"\\.dbf"使用$字符将模式固定在字符串的末尾以找到:

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

1
如果点表示文件扩展名中的点,则它将不起作用。点匹配正则表达式中的单个字符。
Marek

@Marek也注意到了。我的咖啡因储备量必须已经降至阈值以下。
加文·辛普森

嗯,\` escape the 现在应该添加.`。因此,有人想知道为什么这会被否决吗?
加文·辛普森

8

我不太擅长使用复杂的正则表达式,因此可以通过以下方式完成此类任务:

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

第一行仅列出了工作目录中的所有文件。第二个删除包含“ .xml”的所有内容(grep在“文件”向量中返回此类字符串的索引;使用负索引进行子设置会从向量中删除相应的条目)。grep函数的“固定”参数只是我的想法,因为我通常希望它在没有Perl风格的花式正则表达式的情况下执行粗模式匹配,这可能使我感到惊讶。

我知道这种解决方案仅反映了我的教育中的弊端,但对于新手来说,它可能很有用=)至少很容易。


1
您应该先删除-符号grep。我需要这种解决方案来从zip文件中提取特定文件。首先,获取data.frame中的文件列表,并获取特定文件,然后将其提取。 lf <- unzip(file, list=T)[,1]; files.shp <- lf[grep(".shp", lf, fixed=T)]
塞岑

5

为您提供具有完整路径的文件列表:

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

sys.glob万岁!
shadi
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.