2017-06-21 75 views
0

我有一个约500个csv文件的列表,每个文件的文件名由一个六位数字后跟一年(例如123456_2015.csv)组成。我想将具有相同六位数字的所有文件附加在一起。我试图实现在这个问题中建议的代码: Import and rbind multiple csv files with common name in R但我希望将附加数据作为新的csv文件保存在与当前保存的原始文件相同的目录中。我也尝试实现下面的代码,但是由此产生的csv文件不包含数据。将csv文件与通用文件标识符结合使用

rm(list=ls()) 

filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test") 

NAPS_ID <- gsub('.+?\\([0-9]{5,6}?)\\_.+?$', '\\1', filenames) 
Unique_NAPS_ID <- unique(NAPS_ID) 
n <- length(Unique_NAPS_ID) 

for(j in 1:n){ 
     curr_NAPS_ID <- as.character(Unique_NAPS_ID[j]) 
     NAPS_ID_pattern <- paste(".+?\\_(", curr_NAPS_ID,"+?)\\_.+?$", sep = "") 
     NAPS_filenames <- list.files(path = "C:/Users/smithma/Desktop/PM25_test", pattern = NAPS_ID_pattern) 
     write.csv(do.call("rbind", lapply(NAPS_filenames, read.csv, header = TRUE)),file = paste("C:/Users/smithma/Desktop/PM25_test/MERGED", "MERGED_", Unique_NAPS_ID[j], ".csv", sep = ""), row.names=FALSE) 
} 

任何帮助将不胜感激。

回答

0

因为你没有做任何数据操作,你不需要治疗文件,如表格数据。您只需要复制文件内容。

filenames <- list.files("C:/Users/smithma/Desktop/PM25_test", full.names = TRUE) 

NAPS_ID <- substr(basename(filenames), 1, 6) 
Unique_NAPS_ID <- unique(NAPS_ID) 

for(curr_NAPS_ID in Unique_NAPS_ID){ 
    NAPS_filenames <- filenames[startsWith(basename(filenames), curr_NAPS_ID)] 
    output_file <- paste0(
    "C:/Users/nwerth/Desktop/PM25_test/MERGED_", curr_NAPS_ID, ".csv" 
) 
    for (fname in NAPS_filenames) { 
    line_text <- readLines(fname) 
    # Write the header from the first file 
    if (fname == NAPS_filenames[1]) { 
     cat(line_text[1], '\n', sep = '', file = output_file) 
    } 
    # Append every line in the file except the header 
    line_text <- line_text[-1] 
    cat(line_text, file = output_file, sep = '\n', append = TRUE) 
    } 
} 

我的变化:

  • list.files(..., full.names = TRUE)通常是最好的一段路要走。
  • 由于数字出现在文件名的开头,我建议substr。在浏览代码时,更容易了解发生了什么。
  • 而不是循环遍历矢量的索引,循环的值。如果矢量是空的,它会更简洁并且不太可能导致问题。
  • startsWithendsWith是比较新的功能,它们很棒。
  • 您只关心复制行,所以只需使用readLines即可,cat可以将它们取出。
+0

谢谢,工作出色!伟大的建议 – MaddieS

0

你可能会考虑这样的事情:

##will take the first 6 characters of each file name 
six.digit.filenames <- substr(filenames, 1,6) 
path <- "C:/Users/smithma/Desktop/PM25_test/" 
unique.numbers <- unique(six.digit.filenames) 

for(j in unique.numbers){ 
    sub <- filenames[which(substr(filenames,1,6) == j)] 
    data.for.output <- c() 
     for(file in sub){ 
      ##now do your stuff with these files including read them in 
      data <- read.csv(paste0(path,file)) 
      data.for.output <- rbind(data.for.output,data) 
     } 
    write.csv(data.for.output,paste0(path,j, '.csv'), row.names = F) 
}