我希望使用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
提供的答案非常出色。
答案 0 :(得分:6)
快速REGEX 101解释:
对于匹配字符串开头和结尾的情况(这是您需要在此处执行的操作),以下原则适用于匹配.csv
并以parm
开头的文件:
list.files(folder, pattern="^parm.*?\\.csv")
^
断言我们位于字符串的开头,因此^parm
表示匹配parm
,但前提是它位于字符串的开头。
.*?
表示在模式的下一部分匹配之前匹配任何内容。在这种情况下,请匹配,直到我们看到句点\\.
.
表示匹配REGEX中的任何字符,因此我们需要使用\\
对其进行转义以匹配文字.
(请注意,在R中您需要双重转义{{1}在其他语言中,单个转义\\
是足够的。)
最后\
表示在csv
之后匹配csv
。如果我们要非常彻底,我们可以使用.
使用\\.csv$
来表示字符串的结尾。如果您的其他文件的扩展名为$
,则需要美元符号。 .csv2
与\\.csv
匹配,而.csv2
则不匹配。
在您的情况下,您只需使用\\.csv$
,parm
或JS
替换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)