簡體   English   中英

使用正則表達式從帶有R的文件夾中讀取多個csv文件

[英]Reading multiple csv files from a folder with R using regex

我希望使用R從單個文件夾讀取多個csv文件。 如果我想閱讀每個csv文件,可以使用:

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

例如,請參閱以下問題:

從文件夾中讀取多個csv文件到R中的單個數據幀

將多個.csv文件導入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來讀取存在的四個組中的給定組,但是我不知道。

如何分別閱讀四個組?

編輯

我不確定我是否能夠從以下問題的答案中獲得解決方案:

列出與R中的全路徑模式匹配的所有文件

我可能不得不花一些時間重新整理regex才能將這些答案應用於我的問題。 Mako212在下面提供的答案非常出色。

REGEX 101快速說明:

對於匹配字符串的開頭和結尾的情況(這是您在此處需要做的所有事情),以下原則適用於匹配.csv並且以parm開頭的文件:

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

^斷言我們位於字符串的開頭,因此^parm表示match parm ,但^parm是它位於字符串的開頭。

.*? 表示匹配任何內容,直到模式的下一部分匹配為止。 在這種情況下,匹配直到我們看到句點\\\\.

. 表示匹配REGEX中的任何字符,因此我們需要使用\\\\對其進行轉義以匹配文字. (請注意,在R中,您需要雙轉義\\\\ ,在其他語言中,單轉義\\就足夠了)。

最后, csv表示在后面匹配csv . 如果我們真的很徹底,可以使用\\\\.csv$$來表示字符串的結尾。 如果您具有其他擴展名為.csv2文件,則需要美元符號。 \\\\.csv將匹配.csv2 ,而\\\\.csv$將不匹配。

在您的情況下,您可以將REGEX模式中的parm替換為JSmysupN來選擇其他文件類型之一。

最后,如果要匹配總文件列表的一部分,則可以使用| 邏輯“或”運算符:

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

這將返回除以my開頭的文件名以外的所有文件名

問題中顯示的list.files語句正在使用list.files ,但是list.files接受正則表達式 ,而不是glob

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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM