【问题标题】:How to read a CSV file into R using partial file name?如何使用部分文件名将 CSV 文件读入 R?
【发布时间】:2021-02-02 14:32:21
【问题描述】:

我有一个程序可以将数据输出到 CSV 文件中(在名称中标有日期和时间,即 CSVFileName_2021-01-30 12:00:00.csv),然后需要将这些 CSV 文件读入我的下一个程序.如何在忽略日期/时间的情况下仅使用固定文件名读取它们?理想情况下,它总是会选择具有最新时间戳的文件,因为用户可能在一天内多次运行该程序,因此有多个文件具有相同的部分名称但不同的时间或日期。

任何建议将不胜感激!

【问题讨论】:

    标签: r csv datetime


    【解决方案1】:

    您可以使用list.files 获取与该名称模式匹配的所有文件,对它们进行排序(嗯,它们返回时已经按字母顺序排序),然后选择最新的。像这样的:

    most_recent = function(...) {
     tail(list.files(...), 1)
    }
    
    read.csv(most_recent(pattern = "CSVFileName"))
    

    【讨论】:

    • 知道这是否适用于指定的文件路径?我将文件存储在 WD 中的单独文件夹中。并且知道这是否适用于 data.table 包中的 fread 吗?谢谢!
    • 它适用于任何将文件路径作为参数的读取函数。这几乎是所有这些。
    • 我使用...,因此您可以将任何参数传递给list.files。它需要一个path 参数,在这种情况下,您可能也想使用full.names = TRUE。有关所有选项的文档,请参阅 ?list.files
    【解决方案2】:

    如果您有不同的用户生成了不同的文件名,您可以执行以下操作来获取所有用户的最新文件

    library(tidyverse)
    
    files <- c("CSVFileName1_2021-01-30 12:00:00.csv", "CSVFileName1_2021-01-30 11:00:00.csv",
               "CSVFileName1_2021-01-30 10:00:00.csv", "CSVFileName2_2021-01-30 12:00:00.csv",
               "CSVFileName2_2021-01-30 10:00:00.csv", "CSVFileName2_2021-01-30 09:00:00.csv",
               "CSVFileName2_2021-01-30 12:00:00.csv", "CSVFileName3_2021-01-30 11:00:00.csv", 
               "CSVFileName3_2021-01-30 12:00:00.csv", "CSVFileName4_2021-01-30 12:00:00.csv")
    
    files %>% 
      enframe(name = NULL) %>% 
      mutate(file = value) %>% 
      separate(value, into = c("name", "time"), sep = c("_")) %>% 
      mutate(time = time %>% str_remove(".csv") %>% lubridate::as_datetime()) %>% 
      group_by(name) %>% 
      arrange(desc(time)) %>% 
      slice(1) %>% 
      pull(file)
    #> [1] "CSVFileName1_2021-01-30 12:00:00.csv"
    #> [2] "CSVFileName2_2021-01-30 12:00:00.csv"
    #> [3] "CSVFileName3_2021-01-30 12:00:00.csv"
    #> [4] "CSVFileName4_2021-01-30 12:00:00.csv"
    

    reprex package (v0.3.0) 于 2021-02-02 创建

    【讨论】:

      【解决方案3】:

      M.耶茨,

      这里有一些代码,它将使用glob2rx 函数在工作目录中查找与定义的模式(例如“my_file*.csv”)匹配的所有 csv 文件,然后根据该文件的“最后修改”时间。

      # Load library
      library('tidyverse')
      
      # Locate files in working directory
      files <- data.frame('files'=dir(pattern = glob2rx("my_file*.csv")), 
                         stringsAsFactors = FALSE)
      files$modified_time <- file.mtime(files$files)
      
      # Arrange the 'files' dataframe by the 'modified_time' column in descending order
      files <- files %>% arrange(desc(modified_time))
      
      # Read in the latest file which will be in the first row of the 'files' dataframe
      my_df <- read_csv(file=files$file[1])
      

      【讨论】:

        猜你喜欢
        • 2021-10-29
        • 2013-03-10
        • 2017-11-11
        • 1970-01-01
        • 2011-02-07
        • 2017-05-17
        • 2020-08-11
        • 1970-01-01
        • 2013-12-05
        相关资源
        最近更新 更多