使用正则表达式从带有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)