使用regex从R文件夹中读取多个csv文件

时间:2017-11-08 21:07:36

标签: r regex

我希望使用R从单个文件夹中读取多个csv文件。如果我想阅读我可以使用的每个csv文件:

list.files(folder, pattern="*.csv")

例如,请参阅以下问题:

Reading multiple csv files from a folder into a single dataframe in R

Importing multiple .csv files into R

但是,我只希望一次读取文件的四个子集中的一个。下面是三个模型的四个文件的示例分组。

JS.N_Nov6_2017_model220_N200.csv
JS.N_Nov6_2017_model221_N200.csv
JS.N_Nov6_2017_model222_N200.csv
my.IDs.alt_Nov6_2017_model220_N200.csv
my.IDs.alt_Nov6_2017_model221_N200.csv
my.IDs.alt_Nov6_2017_model222_N200.csv
parms_Nov6_2017_model220_N200.csv
parms_Nov6_2017_model221_N200.csv
parms_Nov6_2017_model222_N200.csv
supN_Nov6_2017_model220_N200.csv
supN_Nov6_2017_model221_N200.csv
supN_Nov6_2017_model222_N200.csv

如果我只想阅读parms文件,我会尝试以下操作,但这不起作用:

list.files(folder, pattern="parm*.csv")

我假设我可能需要使用regex来阅读现有的四个小组中的一组,但我不知道。

我如何分别阅读四组中的每一组?

修改

我不确定我是否能够从这个问题的答案中获得解决方案:

Listing all files matching a full-path pattern in R

我可能不得不花费相当多的时间在regex上刷新来解决我的问题。以下Mako212提供的答案非常出色。

2 个答案:

答案 0 :(得分:6)

快速REGEX 101解释:

对于匹配字符串开头和结尾的情况(这是您需要在此处执行的操作),以下原则适用于匹配.csv并以parm开头的文件:

list.files(folder, pattern="^parm.*?\\.csv")

^断言我们位于字符串的开头,因此^parm表示匹配parm,但前提是它位于字符串的开头。

.*?表示在模式的下一部分匹配之前匹配任何内容。在这种情况下,请匹配,直到我们看到句点\\.

.表示匹配REGEX中的任何字符,因此我们需要使用\\对其进行转义以匹配文字.(请注意,在R中您需要双重转义{{1}在其他语言中,单个转义\\是足够的。)

最后\表示在csv之后匹配csv。如果我们要非常彻底,我们可以使用.使用\\.csv$来表示字符串的结尾。如果您的其他文件的扩展名为$,则需要美元符号。 .csv2\\.csv匹配,而.csv2则不匹配。

在您的情况下,您只需使用\\.csv$parmJS替换REGEX模式中的my即可选择其他文件类型。

最后,如果您想匹配整个文件列表的子集,可以使用supN逻辑“或”运算符:

|

除了以list.files(folder, pattern = "^(parm|JS|supN).*?\\.csv")

开头的文件名外,还会返回所有文件名

答案 1 :(得分:2)

问题中显示的list.files语句是使用全局,但list.files接受regular expressions,而不是globs

Sys.glob 要使用globs,请使用Sys.glob,如下所示:

olddir <- setwd(folder)
parm <- lapply(Sys.glob("parm*.csv"), read.csv)

parm现在是从这些文件读入的数据框列表。

glob2rx 请注意,glob2rx函数可用于将globs转换为正则表达式:

parm <- lapply(list.files(folder, pattern = glob2rx("parm*.csv")), read.csv)
相关问题