【问题标题】:Reading multiple csv files from a folder with R using regex使用正则表达式从带有 R 的文件夹中读取多个 csv 文件
【发布时间】:2018-04-21 17:32:29
【问题描述】:

我希望使用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 在下面提供的答案非常出色。

【问题讨论】:

  • Listing all files matching a full-path pattern in R 的可能重复项;特别是,我认为该问题的第一个答案将解决您的问题-看起来您需要转义句点(现在您的模式是“parm”,然后出现任何字符,然后是“csv”)跨度>
  • 获取所有文件名,list.files按字母顺序返回,然后使用split,使用lapply 或 forloop,例如:myFiles <- 1:12; split(myFiles, ceiling(seq_along(myFiles)/3))
  • 对于“parm”:list.files(folder, pattern="^parm.*?\\.csv")

标签: r regex


【解决方案1】:

一个快速的 REGEX 101 解释:

对于匹配字符串的开头和结尾的情况,这是您在此处需要做的所有事情,以下原则适用于匹配.csv 并以parm 开头的文件:

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

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

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

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

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

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

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

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

这将返回除以my 开头的文件名之外的所有文件名

【讨论】:

    【解决方案2】:

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

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

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

    parm 现在是从这些文件中读取的数据帧列表。

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

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

    【讨论】:

    • 请注意,read.csv() 函数的任何参数都可以作为 lapply() 函数中的附加参数传递。例如,如果您有管道分隔的文件,请使用以下内容:lapply(list.files(folder, pattern = glob2rx("parm*.csv")), read.csv, sep='|')
    猜你喜欢
    • 2021-05-01
    • 1970-01-01
    • 2021-10-08
    • 1970-01-01
    • 1970-01-01
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多