使用正则表达式从带有R的文件夹中读取多个csv文件

使用正则表达式从带有R的文件夹中读取多个csv文件,r,regex,R,Regex,我希望使用R从单个文件夹读取多个csv文件。如果我想阅读每个csv文件,我可以使用: list.files(folder, pattern="*.csv") 例如,请参见以下问题: 然而,我只希望一次阅读四个子集文件中的一个。下面是三个模型的四个文件分组示例 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_20

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

list.files(folder, pattern="*.csv")
例如,请参见以下问题:

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

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
来阅读一组给定的四组,但我不知道

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

编辑

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


我可能不得不花相当多的时间复习一下
regex
,才能将这些答案应用到我的问题上。下面由
Mako212
提供的答案非常出色。

一个快速的正则表达式101解释:

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

list.files(文件夹,pattern=“^parm.*?\\.csv”)

^
声明我们位于字符串的开头,因此
^parm
表示匹配
parm
,但仅当它位于字符串的开头时

*?
表示匹配任何内容,直到模式的下一部分匹配为止。在这种情况下,匹配直到我们看到一个句点。

表示匹配正则表达式中的任何字符,因此我们需要使用
\
对其进行转义,以匹配文本
(注意,在R中需要双转义
\\
,在其他语言中,单转义
\
就足够了)

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

在您的情况下,只需将REGEX模式中的
parm
替换为
JS
my
supN
,即可选择其他文件类型之一

最后,如果要匹配总文件列表的子集,可以使用
|
逻辑“或”运算符:

list.files(文件夹,pattern=“^(parm|JS|supN)。*?\\.csv”)


它将返回除以
my
开头的文件名以外的所有文件名。问题中显示的
列表。文件
语句使用globs,但
list。文件
接受,而不是接受

Sys.glob要使用glob,请如下使用:

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

可能的副本;特别是,我认为这个问题的第一个答案会解决你的问题——看起来你需要避开这个句点(现在你的模式是“parm”,然后出现一个字符,然后是“csv”)获取所有文件名,list.files以字母顺序返回它们,然后使用split,并使用lappy或forloop读取数据块,例如:
myFiles For“parm”:
list.files(folder,pattern=“^parm.*?\\.csv”)
请注意,read.csv()函数的任何参数都可以作为lappy()函数中的附加参数传递。例如,如果您有管道分隔文件,请使用以下命令:
lappy(list.files(folder,pattern=glob2rx(“parm*.csv”)),read.csv,sep='|')
parm <- lapply(list.files(folder, pattern = glob2rx("parm*.csv")), read.csv)