导入csv文件并根据R

时间:2017-07-20 14:51:34

标签: r csv for-loop

我有一个大约75个CSV的文件夹,有些是2个同一个站,有些是独立的。

有没有办法遍历文件夹,拉出两个具有相同前4个字符的CSV并导出为一个,合并CSV?在下面的循环中?所有都是相同的结构。

以下是五个示例文件名(在“文件夹”文件夹中)

> files
"13_2016_01-01~2016-09-30.csv"
"13_2016_10-01~2017-06-30.csv"
"1222_2016_01-01~2016-09-30.csv"
"1222_2016_10-01~2017-06-30.csv"
"1114_2016_01-01~2016-09-30.csv"

以下是目前为止在每个文件中读取并导出的代码:

z <- NULL
files <- dir("Folder")

for (file in files) {
  x <- read.csv(file.path("Folder", file), as.is=T, skip=12)

write.csv(x, paste(file)), row.names=F, col.names=F)
}

使用此示例,我想最终得到这个文件列表:

> files
"13_2016-2017.csv"
"1222_2016-2017.csv"
"1114_2016-2017.csv"

2 个答案:

答案 0 :(得分:1)

考虑使用正则表达式匹配解决方案迭代文件前缀集以进行读/写csv操作:

# OP's POSTED EXAMPLE
files <- c("13_2016_01-01~2016-09-30.csv",
           "13_2016_10-01~2017-06-30.csv",
           "1222_2016_01-01~2016-09-30.csv",
           "1222_2016_10-01~2017-06-30.csv",
           "1114_2016_01-01~2016-09-30.csv")

# GENERALIZED FOR ALL CSVs IN WORKING DIR
# files <- list.files(path="/path/to/csv/folder", pattern="\\.csv")         

m <- regexpr("^.*_", files)    
file_prefix <- unique(regmatches(files, m))     # VECTOR OF UNIQUE PREFIX MATCHES
file_prefix
# [1] "13_2016_"   "1222_2016_" "1114_2016_"

# NAMED LIST OF ROW-BINDED DATAFRAMES
dfList <- sapply(file_prefix, function(p){
                dfs <- lapply(list.files(path="/path/to/csv/folder", 
                                         pattern=p, full.names=TRUE), function(f) {
                              setNames(read.csv(f), c("Col1", "Col2", "Col3"))
                       })                                  
                do.call(rbind, dfs)   
          }, simplify=FALSE)

# OUTPUT CSV FILES NAMED WITH PREFIX AND '2016-2017' SUFFIX
out <- mapply(function(d,n) write.csv(d, file=paste0(n,"2016-2017.csv"), row.names=FALSE), 
              dfList, names(dfList), SIMPLIFY=FALSE)

答案 1 :(得分:0)

我没有你的数据就无法测试我的代码所以我会把我的答案更接近伪代码,但我认为这应该有效:

library(stringr)
library(dplyr)
files <- list.files() #List all the files
FileGroups <- paste0(unique(str_sub(files,1,4)),"*") #find the file groups and apend a '*' for regex in next code chunk

for (i in 1:length(FileGroups)){
  df <- list.files(pattern=FileGroups[i])%>% # find all files in one group
    lappy(read_csv()) %>% #read in
    bind_rows() #bind together
  write.csv(df,paste0(FileGroups[i],"_2016-2017.csv")) #output

}

你可能需要解决这个问题,但想法是首先找到所有不同的模式,然后加载所有匹配该模式的csv并绑定它们。我使用this question作为rowbind代码。另外,你说的是4位数的代码,但是根据你的例子,你可能有2位数的代码,如果是这种情况,我会用str_split来查找组。希望这有帮助!