首页 > 解决方案 > 从具有不同日期的两个文件夹中读取所有 CSV 文件的最佳方法 (LOOP)

问题描述

是否有一种简单的方法或循环可以让我从不同日期的两个文件夹相同文件中读取所有 CSV?这些文件夹将具有来自不同日期的相同数据集。目标是能够从这些数据集创建查询,并能够识别随着时间的推移发生的问题。我想用旧/新等标识符重命名 CSV。

示例数据:FILEA.CSV FILEB.CSV FILEC.CSV

读入 R 的文件名:FILEA_old, FILEA_new, FILEB_old, FILEB_new, FILEC_old, FILEC_new

我很早就在编程这个过程中。我已经在这里遇到错误:

Date<-c("17JUL2021", "18AUG2021") 
for (i in Date) {
files <- list.files(path = paste0("~datapath",Date,"//csv//", pattern = '.csv$', full.names = F))}

我需要循环帮助来根据文件是旧文件还是新文件重命名文件:

names <- str_replace(files,".csv","_old")

然后我将所有文件读入R:

for(i in names){
      
  filepath <- file.path(paste(i,".csv",sep=""))
  assign(i, read.csv(filepath))
        
  }

标签: r

解决方案


如果所有 csv 文件的格式相同(或相似),而不是assign将每个 csv 文件转换为不同的对象,我建议将它们全部组合成一个对象,并将文件名作为标识符保留在单独的列中。

我们可以使用map()作为for循环的替代方案,它创建所有输出的列表,可以使用bind_rows.

请注意我如何将所有文件的名称从管道传输list.files到地图中,但如果您愿意,可以将其作为单独的files对象保留。使用recursive = TRUEmeanlist.files查看路径中的所有文件夹,并full.names = TRUE返回每个文件的完整路径。

在此示例中,我有一个父文件夹csv files,然后是 2 个子文件夹folder_1folder_2,每个子文件夹都包含file_1.csv,file_2.csvfile_3.csv

# first we list all the files
list.files(path = 'csv files', full.names = TRUE, recursive = TRUE) %>% 
  
  # then we map() over this function, which reads a csv and then makes a column with the files name
  map(function(x){
    read_csv(x) %>% 
      mutate(
        file = x
      )
  }
    ) %>% 
  
  # join all csvs together
  bind_rows %>% 
  
  # and save it as 'my_data'
  {. ->> my_data} 

my_data

# A tibble: 18 x 2
    data file                         
   <dbl> <chr>                        
 1     1 csv files/folder_1/file_1.csv
 2     2 csv files/folder_1/file_1.csv
 3     3 csv files/folder_1/file_1.csv
 4     1 csv files/folder_1/file_2.csv
 5     2 csv files/folder_1/file_2.csv
 6     3 csv files/folder_1/file_2.csv
 7     1 csv files/folder_1/file_3.csv
 8     2 csv files/folder_1/file_3.csv
 9     3 csv files/folder_1/file_3.csv
10     1 csv files/folder_2/file_1.csv
11     2 csv files/folder_2/file_1.csv
12     3 csv files/folder_2/file_1.csv
13     1 csv files/folder_2/file_2.csv
14     2 csv files/folder_2/file_2.csv
15     3 csv files/folder_2/file_2.csv
16     1 csv files/folder_2/file_3.csv
17     2 csv files/folder_2/file_3.csv
18     3 csv files/folder_2/file_3.csv

如果您想将文件的名称从 to 更改_new_old或任何您喜欢的名称,我建议创建一个新列,并根据文件路径的名称填充它。在此示例中,我可以调用folder_1“旧”文件中的所有文件。

my_data %>% 
  mutate(
    age = ifelse(str_detect(file, 'folder_1'), 'old', 'new')
  )

# A tibble: 18 x 3
    data file                          age  
   <dbl> <chr>                         <chr>
 1     1 csv files/folder_1/file_1.csv old  
 2     2 csv files/folder_1/file_1.csv old  
 3     3 csv files/folder_1/file_1.csv old  
 4     1 csv files/folder_1/file_2.csv old  
 5     2 csv files/folder_1/file_2.csv old  
 6     3 csv files/folder_1/file_2.csv old  
 7     1 csv files/folder_1/file_3.csv old  
 8     2 csv files/folder_1/file_3.csv old  
 9     3 csv files/folder_1/file_3.csv old  
10     1 csv files/folder_2/file_1.csv new  
11     2 csv files/folder_2/file_1.csv new  
12     3 csv files/folder_2/file_1.csv new  
13     1 csv files/folder_2/file_2.csv new  
14     2 csv files/folder_2/file_2.csv new  
15     3 csv files/folder_2/file_2.csv new  
16     1 csv files/folder_2/file_3.csv new  
17     2 csv files/folder_2/file_3.csv new  
18     3 csv files/folder_2/file_3.csv new  

我建议不要修改文件列,因为如果您需要检查原始 csv 文件,它可以方便地追溯问题和对数据进行故障排除。


推荐阅读